如何根据列名将熊猫数据框值转换为字符串

时间:2021-04-27 10:13:15

标签: python python-3.x pandas dataframe

我有一个大约有 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  

知道如何在不单独选择每一列并一一重命名的情况下执行此操作吗?

1 个答案:

答案 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