दिलचस्प पोस्ट
पिछले यादृच्छिक संख्या को दोहराए बिना स्विफ्ट में यादृच्छिक संख्या कैसे उत्पन्न करें? सी # में एक अस्थायी और अपरिवर्तनीय स्ट्रिंग के बीच क्या अंतर है? दो-आयामी सरणी बनाने के लिए सिंटैक्स सी # क्लास सिस्टम का उपयोग क्यों करें.रांडमैन सिस्टम की बजाय सभी। सुरक्षा। क्रिप्टोग्राफी। रैंडम नंबर जनरेटर? सी ++ में एक सार वर्ग के लिए मुझे एक वर्चुअल डिस्ट्रक्टर घोषित क्यों करना चाहिए? डुप्लिकेट की गई पंक्तियों का सूचियां ढूंढें कस्टम मार्करों के साथ एंड्रॉइड मैप्स एपीआई v2 मैं एक्स अक्ष को matplotlib में कैसे बदल सकता हूं, इसलिए कोई सफेद स्थान नहीं है? गिट में एक दूरदराज शाखा को कैसे ट्रैक करना बंद कर दें? एंड्रॉइड में हार गए कुंजीस्टोर पासवर्ड को कैसे संभालना है? जावास्क्रिप्ट काट / टुकड़ा / स्ट्रिंग में अंतिम वर्ण को छानना एंड्रॉइड 6.0 अनुमति त्रुटि अजगर xlrd के साथ Excel सेल से सूत्र प्राप्त करें Xcode 6.xx में अनुपयोगी उपकरण खंड दिखाई दिया स्थिर वर्ग के सदस्य के लिए अनिर्धारित संदर्भ

पंडों / अजगर में डेटाफ्रेम में दो कॉलम जोड़ें

पंडों का इस्तेमाल करते हुए मेरे पास अजगर में 20 x 4000 डाटाफ्रेम है I इनमें से दो स्तंभों का नाम साल और तिमाही है। मैं एक वैरिएबल कॉलम बनाना चाहूंगा जो कि वर्ष = 2000 और तिमाही = q2 को 2000q2 में बना देता है

क्या कोई उस में मदद कर सकता है?

वेब के समाधान से एकत्रित समाधान "पंडों / अजगर में डेटाफ्रेम में दो कॉलम जोड़ें"

dataframe["period"] = dataframe["Year"].map(str) + dataframe["quarter"] 
 df = pd.DataFrame({'Year': ['2014', '2015'], 'quarter': ['q1', 'q2']}) df['period'] = df[['Year', 'quarter']].apply(lambda x: ''.join(x), axis=1) 

यह डेटाफ्रेम पैदा करता है

  Year quarter period 0 2014 q1 2014q1 1 2015 q2 2015q2 

यह विधि आपके df.iloc[:,0:2].apply(lambda x: ''.join(x), axis=1) किसी भी कॉलम स्लाइस के साथ df[['Year', 'quarter']] को बदलकर स्ट्रिंग स्तंभों की एक मनमाना संख्या को सामान्यीकृत करती है, उदा। df.iloc[:,0:2].apply(lambda x: ''.join(x), axis=1)

यह करने के लिए अभी तक एक अन्य तरीके हैं:

 df['period'] = df['Year'].astype(str) + df['quarter'] 

या थोड़ा धीमा:

 df['period'] = df[['Year','quarter']].astype(str).sum(axis=1) 

चलिए इसे 200 के पंक्तियों डीएफ पर जांचें:

 In [250]: df Out[250]: Year quarter 0 2014 q1 1 2015 q2 In [251]: df = pd.concat([df] * 10**5) In [252]: df.shape Out[252]: (200000, 2) 

अद्यतन: पांडा का इस्तेमाल करते हुए नया समय 0.19.0

सीपीयू / जीपीयू ऑप्टिमाइज़ेशन के बिना समय (सबसे तेजी से धीमी गति से क्रमबद्ध):

 In [107]: %timeit df['Year'].astype(str) + df['quarter'] 10 loops, best of 3: 131 ms per loop In [106]: %timeit df['Year'].map(str) + df['quarter'] 10 loops, best of 3: 161 ms per loop In [108]: %timeit df.Year.str.cat(df.quarter) 10 loops, best of 3: 189 ms per loop In [109]: %timeit df.loc[:, ['Year','quarter']].astype(str).sum(axis=1) 1 loop, best of 3: 567 ms per loop In [110]: %timeit df[['Year','quarter']].astype(str).sum(axis=1) 1 loop, best of 3: 584 ms per loop In [111]: %timeit df[['Year','quarter']].apply(lambda x : '{}{}'.format(x[0],x[1]), axis=1) 1 loop, best of 3: 24.7 s per loop 

CPU / GPU ऑप्टिमाइज़ेशन का उपयोग करते समय :

 In [113]: %timeit df['Year'].astype(str) + df['quarter'] 10 loops, best of 3: 53.3 ms per loop In [114]: %timeit df['Year'].map(str) + df['quarter'] 10 loops, best of 3: 65.5 ms per loop In [115]: %timeit df.Year.str.cat(df.quarter) 10 loops, best of 3: 79.9 ms per loop In [116]: %timeit df.loc[:, ['Year','quarter']].astype(str).sum(axis=1) 1 loop, best of 3: 230 ms per loop In [117]: %timeit df[['Year','quarter']].astype(str).sum(axis=1) 1 loop, best of 3: 230 ms per loop In [118]: %timeit df[['Year','quarter']].apply(lambda x : '{}{}'.format(x[0],x[1]), axis=1) 1 loop, best of 3: 9.38 s per loop 

.str सहायक के विधि cat() इस के लिए वास्तव में अच्छी तरह से काम करता है:

 >>> import pandas as pd >>> df = pd.DataFrame([["2014", "q1"], ... ["2015", "q3"]], ... columns=('Year', 'Quarter')) >>> print(df) Year Quarter 0 2014 q1 1 2015 q3 >>> df['Period'] = df.Year.str.cat(df.Quarter) >>> print(df) Year Quarter Period 0 2014 q1 2014q1 1 2015 q3 2015q3 

cat() भी आपको एक विभाजक जोड़ने की अनुमति देता है, उदाहरण के लिए, मान लें कि आपके पास केवल वर्ष और अवधि के लिए पूर्णांक है, आप यह कर सकते हैं:

 >>> import pandas as pd >>> df = pd.DataFrame([[2014, 1], ... [2015, 3]], ... columns=('Year', 'Quarter')) >>> print(df) Year Quarter 0 2014 1 1 2015 3 >>> df['Period'] = df.Year.astype(str).str.cat(df.Quarter.astype(str), sep='q') >>> print(df) Year Quarter Period 0 2014 1 2014q1 1 2015 3 2015q3 

स्ट्रिंग के साथ इस समय एक lamba का उपयोग करें string.format ()

 import pandas as pd df = pd.DataFrame({'Year': ['2014', '2015'], 'Quarter': ['q1', 'q2']}) print df df['YearQuarter'] = df[['Year','Quarter']].apply(lambda x : '{}{}'.format(x[0],x[1]), axis=1) print df Quarter Year 0 q1 2014 1 q2 2015 Quarter Year YearQuarter 0 q1 2014 2014q1 1 q2 2015 2015q2 

यह आपको गैर-स्ट्रिंग और पुन: स्वरूपित मूल्यों के साथ काम करने की अनुमति देता है।

 import pandas as pd df = pd.DataFrame({'Year': ['2014', '2015'], 'Quarter': [1, 2]}) print df.dtypes print df df['YearQuarter'] = df[['Year','Quarter']].apply(lambda x : '{}q{}'.format(x[0],x[1]), axis=1) print df Quarter int64 Year object dtype: object Quarter Year 0 1 2014 1 2 2015 Quarter Year YearQuarter 0 1 2014 2014q1 1 2 2015 2015q2 

यद्यपि @ilvado उत्तर अच्छा है यदि आप df.map(str) को df.astype(str) यह तेज़ हो जाएगा:

 import pandas as pd df = pd.DataFrame({'Year': ['2014', '2015'], 'quarter': ['q1', 'q2']}) In [131]: %timeit df["Year"].map(str) 10000 loops, best of 3: 132 us per loop In [132]: %timeit df["Year"].astype(str) 10000 loops, best of 3: 82.2 us per loop 

यहां एक क्रियान्वयन है जो मुझे बहुत बहुमुखी लगता है:

 In [1]: import pandas as pd In [2]: df = pd.DataFrame([[0, 'the', 'quick', 'brown'], ...: [1, 'fox', 'jumps', 'over'], ...: [2, 'the', 'lazy', 'dog']], ...: columns=['c0', 'c1', 'c2', 'c3']) In [3]: def str_join(df, sep, *cols): ...: from functools import reduce ...: return reduce(lambda x, y: x.astype(str).str.cat(y.astype(str), sep=sep), ...: [df[col] for col in cols]) ...: In [4]: df['cat'] = str_join(df, '-', 'c0', 'c1', 'c2', 'c3') In [5]: df Out[5]: c0 c1 c2 c3 cat 0 0 the quick brown 0-the-quick-brown 1 1 fox jumps over 1-fox-jumps-over 2 2 the lazy dog 2-the-lazy-dog 

जैसा कि आपके डेटा को डेटाफ्रेम में डाला जाता है, इस कमांड को आपकी समस्या को हल करना चाहिए:

 df['period'] = df[['Year', 'quarter']].apply(lambda x: ' '.join(x.astype(str)), axis=1) 

जैसा कि पहले उल्लेख किया है, आपको प्रत्येक स्तंभ को स्ट्रिंग में कनवर्ट करना होगा और फिर दो स्ट्रिंग कॉलमों को संयोजित करने के लिए प्लस ऑपरेटर का उपयोग करना होगा। आप NumPy का उपयोग करके एक बड़ा प्रदर्शन सुधार प्राप्त कर सकते हैं

 %timeit df['Year'].values.astype(str) + df.quarter 71.1 ms ± 3.76 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) %timeit df['Year'].astype(str) + df['quarter'] 565 ms ± 22.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) 
 def madd(x): """Performs element-wise string concatenation with multiple input arrays. Args: x: iterable of np.array. Returns: np.array. """ for i, arr in enumerate(x): if type(arr.item(0)) is not str: x[i] = x[i].astype(str) return reduce(np.core.defchararray.add, x) 

उदाहरण के लिए:

 data = list(zip([2000]*4, ['q1', 'q2', 'q3', 'q4'])) df = pd.DataFrame(data=data, columns=['Year', 'quarter']) df['period'] = madd([df[col].values for col in ['Year', 'quarter']]) df Year quarter period 0 2000 q1 2000q1 1 2000 q2 2000q2 2 2000 q3 2000q3 3 2000 q4 2000q4