首页 > 解决方案 > 多选列与 pandas 数据框的智能合并

问题描述

意见池的结果以 CSV 格式存储,其中有多个答案的问题用 0 和 1 编码。例如,如果问题“您最喜欢哪种颜色?” 被问到 100 个人,可能的答案仅限于红色、蓝色、绿色,结果如

colors = ['red', 'blue', 'green']
votes = [33, 57, 10]

将通过三列存储:一列用于“红色”答案,包含 33 个 1 和 67 个 0,一列用于“蓝色”,包含 57 个 1 和 43 个 0,另一列用于“绿色”,包含 10 个 1 和 90 个 0。

我想转换我的数据框,以便将这三个列合并到一个包含“红色”、“蓝色”和“绿色”出现的唯一列中。

这是我的问题的简化示例:

from pandas import DataFrame

actual_pool = {'foo': [0, 1, 2, 3, 4, 5, 6, 7],
               'red': [1, 0, 0, 1, 0, 1, 0, 0],
               'blue': [0, 1, 0, 0, 0, 0, 1, 1],
               'green': [0, 0, 1, 0, 1, 0, 0, 0],
               'bar': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']}

actual_df = DataFrame(actual_pool,columns= ['foo', 'red', 'blue', 'green', 'bar'])

expected_pool = {'foo': [0, 1, 2, 3, 4, 5, 6, 7], 
                 'colors': ['red', 'blue', 'green', 'red', 'green', 'red', 'blue', 'blue'],
                 'bar': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']}

expected_df = DataFrame(expected_pool,columns= ['foo', 'colors', 'bar'])

print(actual_df)
print(expected_df)

问题是如何使用 pandas 从 actual_df 获得 expected_df?.

编辑 1:添加列 'foo' 和 'bar' 因为我有兴趣合并数据框列的子集。

标签: pythonpandas

解决方案


用于DataFrame.idmax获取具有最大值的列名:

actual_pool = {'red': [1, 0, 0, 1, 0, 1, 0, 0],
               'blue': [0, 1, 0, 0, 0, 0, 1, 1],
               'green': [0, 0, 1, 0, 1, 0, 0, 0]}

actual_df = DataFrame(actual_pool,columns= ['red', 'blue', 'green'])

actual_df['colors'] = actual_df.idxmax(axis=1)

print(actual_df)

输出:

  red  blue  green   colors                                                                                                            
0    1     0      0    red                                                                                                            
1    0     1      0   blue                                                                                                            
2    0     0      1  green                                                                                                            
3    1     0      0    red                                                                                                            
4    0     0      1  green                                                                                                            
5    1     0      0    red                                                                                                            
6    0     1      0   blue                                                                                                            
7    0     1      0   blue    

如果您有额外的列

from pandas import DataFrame

actual_pool = {'red': [1, 0, 0, 1, 0, 1, 0, 0],
               'blue': [0, 1, 0, 0, 0, 0, 1, 1],
               'green': [0, 0, 1, 0, 1, 0, 0, 0],
                'pink': [12,0,11,2,0,90,0,12]
}

actual_df = DataFrame(actual_pool,columns= ['red', 'blue', 'green'])

actual_df['colors'] = actual_df[['red','blue','green']].idxmax(axis=1)

print(actual_df)

推荐阅读