python - 多选列与 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' 因为我有兴趣合并数据框列的子集。
解决方案
用于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)