意见库的结果以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)
问题是如何从大熊猫的actual_df中获取Expected_df?。
编辑1:添加列'foo'和'bar',因为我对合并数据帧列的子集感兴趣。
答案 0 :(得分:1)
使用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)
答案 1 :(得分:0)
尝试:
small_df = actual_df[['red', 'blue', 'green']]
small_df.eq(1) @ small_df.columns
将给出输出
0 red
1 blue
2 green
3 red
4 green
5 red
6 blue
7 blue
dtype: object