পান্ডসে দুটি কলাম থেকে কীভাবে টিউপল কলাম গঠন করবেন


125

আমি একটি পান্ডাস ডেটা ফ্রেম পেয়েছি এবং আমি 'ল্যাট' এবং 'লম্বা' কলামগুলি একত্রিত করতে একটি টিউপল তৈরি করতে চাই।

<class 'pandas.core.frame.DataFrame'>
Int64Index: 205482 entries, 0 to 209018
Data columns:
Month           205482  non-null values
Reported by     205482  non-null values
Falls within    205482  non-null values
Easting         205482  non-null values
Northing        205482  non-null values
Location        205482  non-null values
Crime type      205482  non-null values
long            205482  non-null values
lat             205482  non-null values
dtypes: float64(4), object(5)

আমি যে কোডটি ব্যবহার করার চেষ্টা করেছি তা হ'ল:

def merge_two_cols(series): 
    return (series['lat'], series['long'])

sample['lat_long'] = sample.apply(merge_two_cols, axis=1)

তবে, এটি নিম্নলিখিত ত্রুটিটি ফিরিয়ে দিয়েছে:

---------------------------------------------------------------------------
 AssertionError                            Traceback (most recent call last)
<ipython-input-261-e752e52a96e6> in <module>()
      2     return (series['lat'], series['long'])
      3 
----> 4 sample['lat_long'] = sample.apply(merge_two_cols, axis=1)
      5

...

AssertionError: Block shape incompatible with manager 

কিভাবে আমি এই সমস্যার সমাধান করতে পারে?

উত্তর:


201

সঙ্গে আরাম পাবেন zip। কলামের ডেটা নিয়ে কাজ করার সময় এটি কার্যকর হয়।

df['new_col'] = list(zip(df.lat, df.long))

এটা তোলে কম জটিল এবং দ্রুত ব্যবহার না করে এর applyবা map। এর মতো np.dstackকিছু দ্বিগুণ দ্রুত zip, তবে আপনাকে টিপল দেয় না।


3
পাইথন 3 এ আপনাকে ব্যবহার করতে হবে list। এটি কাজ করা উচিত:df['new_col'] = list(zip(df.lat, df.long))
পলবাসিত

@ পলওয়াসিত আহা হ্যাঁ, আমার প্রেম অজগর 3 এর অলস আচরণের সাথে সম্পর্ককে ঘৃণা করে। ধন্যবাদ।
ডেল জং

4
list(zip(df.lat, df.long))124ms এ এই পদ্ধতিটি 14k df[['lat', 'long']].apply(tuple, axis=1)s 900k সারিগুলির চেয়ে অনেক বেশি কার্যকর । অনুপাতটি 100 এরও বেশি
পেঙ্গজু ঝাও

1
আমি দীর্ঘ কলামগুলির তালিকা সহ এটি ব্যবহার করার চেষ্টা করছি df['new_col'] = list(zip(df[cols_to_keep])) তবে ত্রুটি পেতে থাকি : Length of values does not match length of indexকোনও পরামর্শ?
Seeiespi

1
@ পিটারহানসেনের উত্তরটি আমাকে সাহায্য করেছে তবে মনে হয় এটি প্রথমে তালিকাটি আনপ্যাক করার জন্য একটি * অনুপস্থিত ছিল - যেমন df['new_col'] = list(zip(*[df[c] for c in cols_to_keep])
জেজেড

61
In [10]: df
Out[10]:
          A         B       lat      long
0  1.428987  0.614405  0.484370 -0.628298
1 -0.485747  0.275096  0.497116  1.047605
2  0.822527  0.340689  2.120676 -2.436831
3  0.384719 -0.042070  1.426703 -0.634355
4 -0.937442  2.520756 -1.662615 -1.377490
5 -0.154816  0.617671 -0.090484 -0.191906
6 -0.705177 -1.086138 -0.629708  1.332853
7  0.637496 -0.643773 -0.492668 -0.777344
8  1.109497 -0.610165  0.260325  2.533383
9 -1.224584  0.117668  1.304369 -0.152561

In [11]: df['lat_long'] = df[['lat', 'long']].apply(tuple, axis=1)

In [12]: df
Out[12]:
          A         B       lat      long                             lat_long
0  1.428987  0.614405  0.484370 -0.628298      (0.484370195967, -0.6282975278)
1 -0.485747  0.275096  0.497116  1.047605      (0.497115615839, 1.04760475074)
2  0.822527  0.340689  2.120676 -2.436831      (2.12067574274, -2.43683074367)
3  0.384719 -0.042070  1.426703 -0.634355      (1.42670326172, -0.63435462504)
4 -0.937442  2.520756 -1.662615 -1.377490     (-1.66261469102, -1.37749004179)
5 -0.154816  0.617671 -0.090484 -0.191906  (-0.0904840623396, -0.191905582481)
6 -0.705177 -1.086138 -0.629708  1.332853     (-0.629707821728, 1.33285348929)
7  0.637496 -0.643773 -0.492668 -0.777344   (-0.492667604075, -0.777344111021)
8  1.109497 -0.610165  0.260325  2.533383        (0.26032456699, 2.5333825651)
9 -1.224584  0.117668  1.304369 -0.152561     (1.30436900612, -0.152560909725)

উজ্জ্বল। ধন্যবাদ. পরিষ্কারভাবে ল্যাম্বডা ফাংশনগুলির চারপাশে আমার মাথা পাওয়া দরকার।
elksie5000

এটি কি আপনার ডেটাতে কাজ করেছে? যদি তা হয় তবে আপনি কী নিজের পান্ডাস সংস্করণ এবং ডেটা ভাগ করতে পারবেন? আমি ভাবছি কেন আপনার কোড কাজ করে না, এটি হওয়া উচিত।
ওয়াউটার ওভারমিয়ার

সংস্করণটি 0.10.1_20130131। আমার অজ্ঞতাটি ক্ষমা করুন, তবে আপনার জন্য ডেটার একটি বিভাগ আপলোড করার সর্বোত্তম উপায় কী? (এখনও একটি আপেক্ষিক নবাগত)।
elksie5000

আমি 0.10.1 এ পুনরুত্পাদন করতে ব্যর্থ হয়েছি। আপলোডের সেরা উপায়? আপনি হয় এমন কোড তৈরি করতে পারেন যা একটি ফ্রেম এলোমেলো ডেটা ধারণ করে, একই সমস্যা রয়েছে এবং সেই কোডটি ভাগ করুন বা ফ্রেমের উপরে (নমুনা) বাছাই করুন এবং একটি নিখরচায় বড় ফাইল ট্রান্সফার সার্ভিসের মাধ্যমে স্থানান্তর করুন। কীভাবে আচার করবেন ("," ব্যতীত দুটি লাইনে): আচার আমদানি করুন, ওপেন ('স্যাম্পেল.পিক্লে', 'ডাব্লু') হিসাবে ফাইল হিসাবে: pickle.dump (নমুনা, ফাইল)
ওয়াটার ওভারমিয়ার

1
আমার 10 টি কলাম জিপ করতে হবে এবং 10 বার ডাটাফ্রেমের নাম দিতে চাই না বলে আমি এটিকে উত্সাহিত করেছি। শুধু কলামের নাম দিতে চাই।
ishষি জাইন


3

আমি যোগ করতে চাই df.values.tolist()। (যতক্ষণ না আপনি তালিকার চেয়ে তালিকার কলাম পেতে আপত্তি করবেন না)

import pandas as pd
import numpy as np

size = int(1e+07)
df = pd.DataFrame({'a': np.random.rand(size), 'b': np.random.rand(size)}) 

%timeit df.values.tolist()
1.47 s ± 38.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit list(zip(df.a,df.b))
1.92 s ± 131 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

যখন আপনি শুধু এই দুটি কলাম চেয়ে বেশি আছে: %timeit df[['a', 'b']].values.tolist()। এটি এখনও অনেক দ্রুত।
চেইমজি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.