我有一個如下的資料框;
df_d = {'consolidate_elem': {0: np.nan,
1: np.nan,
2: np.nan,
3: np.nan,
4: np.nan,
5: np.nan,
6: np.nan,
7: np.nan,
8: np.nan,
9: np.nan,
10: np.nan},
'A': {0: np.nan,
1: np.nan,
2: '6/9/1972',
3: '9/4/1943',
4: '1/29/1944',
5: '7/31/1965',
6: '4/5/1979',
7: np.nan,
8: '3/17/2000',
9: '3/18/2000',
10: '3/17/2000'},
'B': {0: np.nan,
1: np.nan,
2: np.nan,
3: 'Yes',
4: np.nan,
5: np.nan,
6: np.nan,
7: np.nan,
8: np.nan,
9: np.nan,
10: np.nan},
'C': {0: np.nan,
1: np.nan,
2: np.nan,
3: np.nan,
4: 'Yes',
5: 'Yes',
6: np.nan,
7: 'Yes',
8: 'Yes',
9: 'Yes',
10: 'Yes'},
'D': {0: '11100',
1: '11721',
2: np.nan,
3: '55626',
4: '5,562,655,626.00',
5: np.nan,
6: np.nan,
7: '33050',
8: '33050',
9: '33050',
10: np.nan}}

在這里,我想用列名填充列consolidate_elem,其行不是上述資料框中的 NAN。預期輸出如下;

因此,在第一行中,我們在 D 列中有一個值,因此在 consolidate_elem 中將其填充為 D。
同樣在索引 -4 中,它是 A;C;D 因為它們有值。
uj5u.com熱心網友回復:
用于DataFrame.dot矩陣乘法,通過通過DataFrame.notna省略第一列比較未缺失值創建的掩碼:
df = pd.DataFrame(df_d)
df['consolidate_elem'] = df.iloc[:, 1:].notna().dot(df.columns[1:] ';').str.strip(';')
print (df)
consolidate_elem A B C D
0 D NaN NaN NaN 11100
1 D NaN NaN NaN 11721
2 A 6/9/1972 NaN NaN NaN
3 A;B;D 9/4/1943 Yes NaN 55626
4 A;C;D 1/29/1944 NaN Yes 5,562,655,626.00
5 A;C 7/31/1965 NaN Yes NaN
6 A 4/5/1979 NaN NaN NaN
7 C;D NaN NaN Yes 33050
8 A;C;D 3/17/2000 NaN Yes 33050
9 A;C;D 3/18/2000 NaN Yes 33050
10 A;C 3/17/2000 NaN Yes NaN
或按名稱洗掉列:
df['consolidate_elem'] = (df.drop('consolidate_elem', axis=1).notna()
.dot(df.columns.drop('consolidate_elem') ';')
.str.strip(';'))
uj5u.com熱心網友回復:
在我看來,使用 lambda 回傳串列更干凈、更好:
df['consolidate_elem']=df.apply(lambda row: row.index[row.isna()].tolist(), axis=1)
或者,如果您需要該值是半列分隔的字串:
df['consolidate_elem']=df.apply(lambda row: ";".join(row.index[row.isna()].tolist()), axis=1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/441551.html
下一篇:如何獲得Python中的虛部?
