2015-04-21 32 views
12

मैं पांडा के साथ काम कर रहा हूँ में पांडा डेटा फ्रेम स्तंभ मान कम्बाइन और मैं जहाँ हम तीन में से एक मान आबादी वाले हो सकता है एक डेटा फ्रेम:नया स्तंभ

ID_1 ID_2 ID_3 
abc  NaN  NaN 
NaN  def  NaN 
NaN  NaN  ghi 
NaN  NaN  jkl 
NaN  mno  NaN 
pqr  NaN  NaN 

और मेरा लक्ष्य ये तीन कॉलम गठबंधन करने के लिए है अपने डेटा फ्रेम में एक नया कॉलम में:

ID_1 ID_2 ID_3 Combined_ID 
abc  NaN  NaN abc 
NaN  def  NaN def 
NaN  NaN  ghi ghi 
NaN  NaN  jkl jkl 
NaN  mno  NaN mno 
pqr  NaN  NaN pqr 

आदर्श रूप में यह सिर्फ मिलेगा जो कुछ भी नहीं शून्य मान 3 के माध्यम से 1 कॉलम में मौजूद है, लेकिन मैं यह भी जोड़ सकते हैं, क्योंकि हम केवल तीन प्रत्येक पंक्ति के लिए आबादी में से एक होना चाहिए । धन्यवाद।

df_note = pd.read_csv("NoteIds.csv") 
df_note['Combined_ID'] = # ID_1 + ID_2 + ID_3 
+1

क्या हम निश्चित हैं कि प्रति पंक्ति केवल एक गैर-एनएन मूल्य है? – DSM

+0

@EdChum - वास्तव में अन्य कॉलम भी हैं। तो हाँ, केवल एक गैर NaN लेकिन केवल उन 3 कॉलम के लिए, पूरी पंक्ति नहीं। – EMC

उत्तर

3

मान लीजिए कि प्रति पंक्ति एक से अधिक गैर-एनएन मूल्य हो सकते हैं। फिर भी यह काम करना चाहिए।

In [43]: df['Combined_ID'] = df.apply(
       lambda x : ''.join([e for e in x if isinstance(e, basestring)]), 
         axis=1) 

प्रत्येक पंक्ति के लिए, स्ट्रिंग आइटम निकालें और उनसे जुड़ें।

In [44]: df 
Out[44]: 
    ID_1 ID_2 ID_3 Combined_ID 
0 abc NaN NaN   abc 
1 NaN def NaN   def 
2 NaN NaN ghi   ghi 
3 NaN NaN jkl   jkl 
4 NaN mno NaN   mno 
5 pqr NaN NaN   pqr 

मुझे @ एडचम का जवाब पसंद आया और अधिक पठनीय दिखता है।

दिलचस्प बात यह है कि fillna('').sum(axis=1) विधि इस छोटे डेटा के लिए महंगा है।

In [45]: %timeit df.fillna('').sum(axis=1) 
1000 loops, best of 3: 808 µs per loop 

In [46]: %timeit df.apply(lambda x : ''.join([e for e in x if isinstance(e, basestring)]), axis=1) 
1000 loops, best of 3: 285 µs per loop 
लिए

, ['ID_1','ID_2','ID_3'] स्तंभ केवल

df[['ID_1','ID_2','ID_3']].apply(lambda_function) 
+0

यह आश्चर्यजनक नहीं है लेकिन 'लागू' अच्छी तरह से स्केल नहीं करता है, मैंने अभी 600 पंक्ति डीएफ पर समय लगाया है और समय 6.24ms बनाम 33.3ms बनाम आपकी विधि की तुलना में आपकी विधि की तुलना में, मुझे उम्मीद है कि प्रदर्शन अंतर में काफी वृद्धि होगी डेटासेट – EdChum

+0

क्या मुझे केवल 3 कॉलम निर्दिष्ट करने का कोई तरीका है? यह अन्य गैर-संबंधित कॉलम शामिल हो रहा है। – EMC

+0

@EdChum बिल्कुल, 'लागू' बड़े डेटासेट पर अच्छा प्रदर्शन नहीं करता है। इसलिए, मैंने इस छोटे डेटा के लिए महंगा * उल्लेख किया है। * =) – Zero

12

ताकि आप fillna फोन और एक खाली str और कॉल sum गुजरती हैं और परम axis=1 गुजारें सकता आप संपत्ति है कि संक्षेप स्ट्रिंग मान जोड़ होगा उपयोग कर सकते हैं पंक्ति-वार योग करने के लिए:

In [26]: 

df['Combined_ID'] = df.fillna('').sum(axis=1) 
df 
Out[26]: 
    ID_1 ID_2 ID_3 Combined_ID 
0 abc NaN NaN   abc 
1 NaN def NaN   def 
2 NaN NaN ghi   ghi 
3 NaN NaN jkl   jkl 
4 NaN mno NaN   mno 
5 pqr NaN NaN   pqr 

आप केवल उन 3 कॉलम में रुचि रखते हैं तो आप सिर्फ उनका चयन कर सकते हैं:

In [39]: 

df['Combined_ID'] = df[['ID_1','ID_2','ID_3']].fillna('').sum(axis=1) 
df 
Out[39]: 
    ID_1 ID_2 ID_3 Combined_ID 
0 abc NaN NaN   abc 
1 NaN def NaN   def 
2 NaN NaN ghi   ghi 
3 NaN NaN jkl   jkl 
4 NaN mno NaN   mno 
5 pqr NaN NaN   pqr 
+0

' df.max (axis = 1)' मुझे लगता है कि 'fillna' की आवश्यकता के बिना किया जाएगा। – piroot

संबंधित मुद्दे