将多种选择的列与熊猫的数据框进行智能合并

时间:2019-04-15 09:38:13

标签: 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)

问题是如何从大熊猫的actual_df中获取Expected_df?

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

2 个答案:

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