मेरे पास 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)

सभी विचारों का स्वागत है

0
Chip 30 जुलाई 2021, 18:37

4 जवाब

सबसे बढ़िया उत्तर

क्या यही मुझे करना होगा:

df1['new'] = np.NaN    
for col in df1.columns.tolist()[1:-1]:
    df1.loc[df1[col].str[0] == df1['letter'], 'new'] = df1[col]
-1
Aryerez 30 जुलाई 2021, 18:47

अपने डेटा को कॉलम प्रारूप में स्टैक करें ताकि आप कॉलम-ऑन-कॉलम पर कार्य कर सकें। फिर उन स्थानों पर उपसमुच्चय करें जहां मान मेल खाते हैं।

>>> 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# कॉलम में एक से अधिक मान्य मिलान हैं, तो यह विधि एकाधिक मिलानों के बारे में एक त्रुटि उत्पन्न करेगी। मेरे विचार में, पंडों की त्रुटियों को फेंकने की सापेक्ष इच्छा (विशेषकर आर या एसएएस की तुलना में) मूक डेटा बग से बचने के लिए वास्तव में अच्छी है। भले ही, अगर डुप्लीकेट कोई समस्या है, तो बस डुप्लीकेट छोड़ें

2
ifly6 30 जुलाई 2021, 19:31

यहां एक-पंक्ति समाधान है, जहां हम उप-परिणाम का उपयोग करते हैं प्रत्येक पंक्ति से पहला गैर-शून्य मान प्राप्त करें:

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
0
smci 30 जुलाई 2021, 20:42

यहाँ एक और तरीका है:

df['new'] = (df.loc[:,'info1':].where(df.loc[:,'info1':]
                          .applymap(lambda x: x[0])
                          .eq(df['letter'],axis=0))
 .ffill(axis=1).iloc[:,-1])
0
rhug123 30 जुलाई 2021, 20:53