मेरे पास df1 नामक डेटाफ्रेम है:
d = {'letter':['R','V','Q','M','F','K'], 'info1':['K:2.3','T:1.3','L:2.4','B:7.4','S:2.3','K:4.4'], 'info2':['R:3.2','N:2.1','B:0.3','T:0.9','J:0.003','S:1.223'], 'info3':['X:45','V:32.4','H:0.04','M:3.34','T:2.2','T:3.456'], 'info4':['A:1.7','Z:1.2345','T:9.5','O:3,2','J:3.334','G:345']}
df1 = pd.DataFrame(d)
Df1:
letter info1 info2 info3 info4
0 R K:2.3 R:3.2 X:45 A:1.7
1 V T:1.3 N:2.1 V:32.4 Z:1.2345
2 Q L:2.4 B:0.3 H:0.04 T:9.5
3 M B:7.4 T:0.9 M:3.34 O:3,2
4 F S:2.3 J:0.003 T:2.2 J:3.334
5 K K:4.4 S:1.223 T:3.456 G:345
मैं उसी पंक्ति पर उस स्ट्रिंग की घटना के साथ कॉलम "अक्षर" में तारों से आंशिक रूप से मिलान करना चाहता हूं और मैच को एक नए कॉलम में रखना चाहता हूं। अगर एक ही पंक्ति में कोई मैच नहीं है तो मैं सिर्फ NaN डालना चाहता हूं।
वांछित आउटपुट:
letter info1 info2 info3 info4 new
0 R K:2.3 R:3.2 X:45 A:1.7 R:3.2
1 V T:1.3 N:2.1 V:32.4 Z:1.2345 V:32.4
2 Q L:2.4 B:0.3 H:0.04 T:9.5 NaN
3 M B:7.4 T:0.9 M:3.34 O:3,2 M:3.34
4 F S:2.3 J:0.003 T:2.2 J:3.334 NaN
5 K K:4.4 S:1.223 T:3.456 G:345 K:4.4
मैंने शुरुआत में मास्क बनाने की कोशिश की लेकिन वह काम नहीं किया।
df1['new'] = df1.drop("letter", 1).isin(df1["letter"]).any(1)
सभी विचारों का स्वागत है
4 जवाब
क्या यही मुझे करना होगा:
df1['new'] = np.NaN
for col in df1.columns.tolist()[1:-1]:
df1.loc[df1[col].str[0] == df1['letter'], 'new'] = df1[col]
अपने डेटा को कॉलम प्रारूप में स्टैक करें ताकि आप कॉलम-ऑन-कॉलम पर कार्य कर सकें। फिर उन स्थानों पर उपसमुच्चय करें जहां मान मेल खाते हैं।
>>> s = df1.set_index('letter').stack()
>>> s[s.index.get_level_values(0) == s.str[0]]
letter
R info2 R:3.2
V info3 V:32.4
M info3 M:3.34
K info1 K:4.4
dtype: object
इसे मूल डेटा फ़्रेम के विरुद्ध मैप करें:
>>> s1 = _ # ie, the value coming out of the subset immediately above
>>> df1['letter'].map(s1.reset_index(level=1, drop=True))
0 R:3.2
1 V:32.4
2 NaN
3 M:3.34
4 NaN
5 K:4.4
Name: letter, dtype: object
फिर उसे अपने डेटा फ्रेम में df1['new']
के रूप में असाइन करें। ध्यान दें कि यदि आपके info#
कॉलम में एक से अधिक मान्य मिलान हैं, तो यह विधि एकाधिक मिलानों के बारे में एक त्रुटि उत्पन्न करेगी। मेरे विचार में, पंडों की त्रुटियों को फेंकने की सापेक्ष इच्छा (विशेषकर आर या एसएएस की तुलना में) मूक डेटा बग से बचने के लिए वास्तव में अच्छी है। भले ही, अगर डुप्लीकेट कोई समस्या है, तो बस डुप्लीकेट छोड़ें।
यहां एक-पंक्ति समाधान है, जहां हम उप-परिणाम का उपयोग करते हैं प्रत्येक पंक्ति से पहला गैर-शून्य मान प्राप्त करें:
df1['new'] = df1.apply(lambda row: row[1:5][row.str.match(row['letter'])], axis=1).fillna(method='bfill', axis=1).iloc[:, 0]
0 R:3.2
1 V:32.4
2 NaN
3 M:3.34
4 NaN
5 K:4.4
यहाँ एक और तरीका है:
df['new'] = (df.loc[:,'info1':].where(df.loc[:,'info1':]
.applymap(lambda x: x[0])
.eq(df['letter'],axis=0))
.ffill(axis=1).iloc[:,-1])
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।