मैं नीचे की तरह विरल डेटा फ़्रेम के साथ काम करता हूं:

df = pd.DataFrame.from_dict({'type': {581: 'A', 1638: 'B', 706: 'C', 422: 'B', 487: 'A', 1503: 'D', 1948: 'B', 700: 'E', 2040: 'D', 1664: 'C'}, 'set1_a': {581: 27.08, 1638: np.nan, 706: 92.37, 422: np.nan, 487: np.nan, 1503: np.nan, 1948: np.nan, 700: np.nan, 2040: np.nan, 1664: np.nan}, 'set1_b': {581: 68.0, 1638: np.nan, 706: 0.0, 422: np.nan, 487: np.nan, 1503: np.nan, 1948: np.nan, 700: np.nan, 2040: np.nan, 1664: np.nan}, 'set2_a': {581: np.nan, 1638: np.nan, 706: np.nan, 422: np.nan, 487: np.nan, 1503: np.nan, 1948: np.nan, 700: 21.99, 2040: np.nan, 1664: np.nan}, 'set2_b': {581: np.nan, 1638: np.nan, 706: np.nan, 422: np.nan, 487: np.nan, 1503: np.nan, 1948: np.nan, 700: 92.91, 2040: np.nan, 1664: np.nan}, 'set3_a': {581: 28.56, 1638: 21.79, 706: 95.15, 422: 45.1, 487: 65.33, 1503: 85.6, 1948: 51.5, 700: 98.14, 2040: 40.37, 1664: 66.18}, 'set3_b': {581: 68.0, 1638: 59.3, 706: 0.0, 422: 51.42, 487: 59.07, 1503: 57.1, 1948: 34.6, 700: 6.02, 2040: 8.25, 1664: 58.47}})

     type  set1_a  set1_b  set2_a  set2_b  set3_a  set3_b
581     A   27.08    68.0     NaN     NaN   28.56   68.00
1638    B     NaN     NaN     NaN     NaN   21.79   59.30
706     C   92.37     0.0     NaN     NaN   95.15    0.00
422     B     NaN     NaN     NaN     NaN   45.10   51.42
487     A     NaN     NaN     NaN     NaN   65.33   59.07
1503    D     NaN     NaN     NaN     NaN   85.60   57.10
1948    B     NaN     NaN     NaN     NaN   51.50   34.60
700     E     NaN     NaN   21.99   92.91   98.14    6.02
2040    D     NaN     NaN     NaN     NaN   40.37    8.25
1664    C     NaN     NaN     NaN     NaN   66.18   58.47

मेरा लक्ष्य set1_a और set1_b कॉलम को type पर लागू कुछ नियमों के आधार पर भरना है। प्रत्येक प्रकार को कुछ समूह को निम्नानुसार सौंपा जा सकता है:

type_group1 = ['A', 'C', 'B', 'D']
type_group2 = ['E', 'F', 'G']

और नियम इस प्रकार हैं:

  1. यदि type, type_group1 में है, तो यदि set1_a और set1_b में पहले से ही मान हैं तो उन्हें वैसे ही छोड़ दें, अन्यथा उन्हें set3_a और set3_b असाइन करें। .
  2. अगर type, type_group2 में है तो set2_a और set2_b को क्रमशः set1_a और set2_b को असाइन करें।

वास्तविक प्रकार और प्रकार समूह बहुत अधिक जटिल हैं इसलिए मैं कोड संक्षिप्तता के लिए पंडों के विचार बनाना चाहता था और उन्हें निम्नानुसार उपयोग करना चाहता था:

type_group1_df = df[df['type'].isin(type_group1)]
type_group1_df.loc[type_group1_df['set1_a'].isnull(), 'set1_a'] = type_group1_df['set3_a']
type_group1_df.loc[type_group1_df['set1_b'].isnull(), 'set1_b'] = type_group1_df['set3_b']

type_group2_df = df[df['type'].isin(type_group2)]
type_group2_df[['set1_a', 'set1_b']] = type_group2_df[['set2_a', 'set2_b']]

हालांकि, दोनों मूल df में डालने के बजाय एक नया डेटा फ़्रेम लौटाते हैं। इसलिए मेरा मानना ​​है कि वे अंदर df की प्रतियां बना रहे हैं, दृश्य नहीं। मैं मूल df में सम्मिलित करने के लिए पंडों के दृश्य कैसे बना सकता हूं?

अपेक्षित आउटपुट होगा:

     type  set1_a  set1_b  set2_a  set2_b  set3_a  set3_b
581     A   27.08   68.00     NaN     NaN   28.56   68.00
1638    B   21.79   59.30     NaN     NaN   21.79   59.30
706     C   92.37    0.00     NaN     NaN   95.15    0.00
422     B   45.10   51.42     NaN     NaN   45.10   51.42
487     A   65.33   59.07     NaN     NaN   65.33   59.07
1503    D   85.60   57.10     NaN     NaN   85.60   57.10
1948    B   51.50   34.60     NaN     NaN   51.50   34.60
700     E   21.99   92.91   21.99   92.91   98.14    6.02
2040    D   40.37    8.25     NaN     NaN   40.37    8.25
1664    C   66.18   58.47     NaN     NaN   66.18   58.47
0
Xaume 8 फरवरी 2020, 14:08
क्या आप अपने अपेक्षित आउटपुट का डेटाफ्रेम पोस्ट कर सकते हैं?
 – 
sammywemmy
8 फरवरी 2020, 14:40
मैंने अपेक्षित आउटपुट के साथ संपादित किया है।
 – 
Xaume
8 फरवरी 2020, 14:55

2 जवाब

आप अपनी शर्तों को isin के साथ सेट कर सकते हैं और फिर कॉलम असाइन करने के लिए np.select का उपयोग कर सकते हैं:

cond1 = (df["type"].isin(type_group1))&(df["set1_a"].isnull())&(df["set1_b"].isnull())
cond2 = df["type"].isin(type_group2)

df["set1_a"] = np.select([cond1, cond2],[df["set3_a"],df["set2_a"]],default=df["set1_a"])
df["set1_b"] = np.select([cond1, cond2],[df["set3_b"],df["set2_b"]],default=df["set1_b"])

print (df)

     type  set1_a  set1_b  set2_a  set2_b  set3_a  set3_b
581     A   27.08   68.00     NaN     NaN   28.56   68.00
1638    B   21.79   59.30     NaN     NaN   21.79   59.30
706     C   92.37    0.00     NaN     NaN   95.15    0.00
422     B   45.10   51.42     NaN     NaN   45.10   51.42
487     A   65.33   59.07     NaN     NaN   65.33   59.07
1503    D   85.60   57.10     NaN     NaN   85.60   57.10
1948    B   51.50   34.60     NaN     NaN   51.50   34.60
700     E   21.99   92.91   21.99   92.91   98.14    6.02
2040    D   40.37    8.25     NaN     NaN   40.37    8.25
1664    C   66.18   58.47     NaN     NaN   66.18   58.47
0
Henry Yik 8 फरवरी 2020, 15:15

आप प्रासंगिक शर्तों के साथ numpy.where का इस्तेमाल कर सकते हैं अपना वांछित डेटाफ्रेम प्राप्त करने के लिए:

cond_set1a = (df.type.isin(type_group1)) & df.set1_a.isna()
cond_set1b = (df.type.isin(type_group1)) & df.set1_b.isna()
cond_set2 = df.type.isin(type_group2)

df['set1_a'] = np.where(cond_set1a, df.set3_a,df.set1_a)
df['set1_b'] = np.where(cond_set1b, df.set3_b,df.set1_b)
df['set1_a'] = np.where(cond_set2, df.set2_a, df.set1_a)
df['set1_b'] = np.where(cond_set2, df.set2_b, df.set1_b)

df

        type    set1_a  set1_b  set2_a  set2_b  set3_a  set3_b
581     A   27.08   27.08   NaN NaN 28.56   68.00
1638    B   21.79   21.79   NaN NaN 21.79   59.30
706     C   92.37   92.37   NaN NaN 95.15   0.00
422     B   45.10   45.10   NaN NaN 45.10   51.42
487     A   65.33   65.33   NaN NaN 65.33   59.07
1503    D   85.60   85.60   NaN NaN 85.60   57.10
1948    B   51.50   51.50   NaN NaN 51.50   34.60
700     E   21.99   92.91   21.99   92.91   98.14   6.02
2040    D   40.37   40.37   NaN NaN 40.37   8.25
1664    C   66.18   66.18   NaN NaN 66.18   58.47

आपके उपयोग के मामले के आधार पर, numpy select by @Henry अधिक संक्षिप्त दृष्टिकोण प्रदान करेगा।

0
sammywemmy 8 फरवरी 2020, 15:30