पंडों में दो कॉलम से टपल कॉलम कैसे बनाएं


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
python3 में, आपको उपयोग करना होगा list। यह काम करना चाहिए:df['new_col'] = list(zip(df.lat, df.long))
paulwasit

@paulwasit आह हां, मेरा प्यार अजगर 3 के आलसी व्यवहार के साथ संबंध से नफरत करता है। धन्यवाद।
डेल जंग

4
list(zip(df.lat, df.long))124ms में यह विधि df[['lat', 'long']].apply(tuple, axis=1)900k पंक्तियों के लिए 14.2 s की तुलना में बहुत अधिक कुशल है । अनुपात 100 से अधिक है।
पेंगु झाओ

1
मैं स्तंभों की लंबी सूची के साथ इसका उपयोग करने की कोशिश कर रहा हूं, df['new_col'] = list(zip(df[cols_to_keep])) लेकिन एक त्रुटि मिलती रही है: Length of values does not match length of indexकोई सलाह?
22

1
@ PeterHansen का जवाब मुझे मदद की लेकिन लगता है कि यह हो सकता है एक * लापता कर दिया है पहली सूची को अनपैक करने के - यानी df['new_col'] = list(zip(*[df[c] for c in cols_to_keep])
jedge

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 (नमूना, फ़ाइल): फ़ाइल के रूप में ( 'w' 'sample.pickle',) आयात अचार, खुले साथ: कैसे (दो पंक्तियों में, बिना ",") अचार के लिए
Wouter Overmeire

1
मैंने इसे 10 कॉलमों को ज़िप करने की आवश्यकता के रूप में उकेरा है और 10 बार डेटाफ्रेम नाम नहीं देना चाहता। बस कॉलम नाम देना चाहते हैं।
ऋषि जैन


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():। यह अभी भी बहुत तेज है।
चैमग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.