我有以下資料框
df
ID Col_1 Col_2 Col_3
1 0 1 1
2 1 0 0
3 1 1 1
4 1 1 0
我想檢查除 ID 之外的每一列都有 0 值。如果他們在新列下寫了列名Category。如果同一行有多個 0 值,則復制具有不同類別值的行。如果整行中沒有任何 0 值,則將列的值留空Category。
我想按如下方式獲取資料框。
ID Col_1 Col_2 Col_3 Category
1 0 1 1 Col_1
2 1 0 0 Col_2
2 1 0 0 Col_3
3 1 1 1
4 1 1 0 Col_3
有人可以幫忙嗎?
uj5u.com熱心網友回復:
如果需要由值填充的所有列0使用矩陣乘法dot,則使用DataFrame.explode拆分值(大 df 的性能應該更差):
df['Category'] = (df.iloc[:, 1:].eq(0).dot(df.columns[1:] ',')
.str.strip(',').str.split(','))
df = df.explode('Category')
print (df)
ID Col_1 Col_2 Col_3 Category
0 1 0 1 1 Col_1
1 2 1 0 0 Col_2
1 2 1 0 0 Col_3
2 3 1 1 1
3 4 1 1 0 Col_3
編輯:
s = df.set_index('ID').stack()
df = (df.join(s[s.eq(0)].reset_index(level=1)['level_1'].rename('Category'), on='ID')
.fillna({'Category':''}))
print (df)
ID Col_1 Col_2 Col_3 Category
0 1 0 1 1 Col_1
1 2 1 0 0 Col_2
1 2 1 0 0 Col_3
2 3 1 1 1
3 4 1 1 0 Col_3
或者:
s = df.melt('ID').query('value == 0').set_index('ID')['variable']
df = df.join(s.rename('Category'), on='ID').fillna({'Category':''})
print (df)
ID Col_1 Col_2 Col_3 Category
0 1 0 1 1 Col_1
1 2 1 0 0 Col_2
1 2 1 0 0 Col_3
2 3 1 1 1
3 4 1 1 0 Col_3
uj5u.com熱心網友回復:
一種選擇是mask非零,stack擺脫它們,并join添加新列,同時按預期復制行:
s = (df.drop('ID', axis=1).mask(lambda d: d.ne(0)).stack()
.reset_index(level=1)['level_1'].rename('Category'))
df2 = df.join(s)
輸出:
ID Col_1 Col_2 Col_3 Category
0 1 0 1 1 Col_1
1 2 1 0 0 Col_2
1 2 1 0 0 Col_3
2 3 1 1 1
3 4 1 1 0 Col_3
uj5u.com熱心網友回復:
這個怎么樣:
df['category']=df[['col1','col2','col3']]
.apply(lambda row:row[row==0].index.values, axis=1)
輸出:
col1 col2 col3 category
ID
0 1 0 1 [col2]
1 0 0 1 [col1, col2]
2 1 1 0 [col3]
正如您在此示例中看到的 ID 索引,但它不一定是,因為您可以選擇您正在使用的列,然后當然您可以運行:
df.explode('category')
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/424781.html
