我有一个大约有 20 万行和 20 列的数据框,如下所示:
List |Apple|Banana|Bread|Milk|Sweets|Water|
List1|0 | 0 |0 | 1 | 0 | 0 |
List2|0 | 1 |0 | 0 | 0 | 0 |
List3|0 | 0 |0 | 1 | 0 | 0 |
List4|0 | 0 |0 | 0 | 1 | 0 |
List5|0 | 0 |1 | 0 | 0 | 0 |
我想用相关的列名替换每个 1
,然后将数据帧减少到以下输出:
List |Items
List1|Milk
List2|Banana
List3|Milk
List4|Sweets
List5|Bread
知道如何在不单独选择每一列并一一重命名的情况下执行此操作吗?
答案 0 :(得分:1)
这是使用 DataFrame.dot
的解决方案,如果每行有多个 1
,则将列名称连接到 ,
,如果只有一个值也有效:
df = df.set_index('List')
df1 = df.dot(df.columns + ',').str[:-1].reset_index(name='Items')
print (df1)
List Items
0 List1 Milk
1 List2 Banana
2 List3 Milk
3 List4 Sweets
4 List5 Bread
如果每行总是有 1 个 1
值,也可以使用:
df = df.set_index('List')
df1 = df.dot(df.columns).reset_index(name='Items')
print (df1)
List Items
0 List1 Milk
1 List2 Banana
2 List3 Milk
3 List4 Sweets
4 List5 Bread
但是,如果它使用多个值连接而没有分隔符,例如:
print (df)
List Apple Banana Bread Milk Sweets Water
0 List1 1 0 0 1 0 0 <- Apple,Milk=1
1 List2 0 1 0 0 0 0
2 List3 0 0 0 1 0 0
3 List4 0 0 0 0 1 0
4 List5 0 0 1 0 0 0
df = df.set_index('List')
df1 = df.dot(df.columns).reset_index(name='Items')
print (df1)
List Items
0 List1 AppleMilk
1 List2 Banana
2 List3 Milk
3 List4 Sweets
4 List5 Bread
带分隔符的输出是:
df = df.set_index('List')
df1 = df.dot(df.columns + ',').str[:-1].reset_index(name='Items')
print (df1)
List Items
0 List1 Apple,Milk
1 List2 Banana
2 List3 Milk
3 List4 Sweets
4 List5 Bread