熊猫:转换数据框以显示原始数据框中是否存在值的组合


问题内容

我有一个看起来像这样的数据框:

 | Col 1 | Col 2 | 
0|   A   |   2   |
1|   A   |   3   |
2|   B   |   1   |
3|   B   |   2   |

并且我需要将其转换为一个数据框,以显示每个组合的第1列和第2列中的值(如果该组合包含在原始DataFrame中):

  |  1  |  2  |  3  |
A |False|True |True |
B |True |True |False|

熊猫有没有一种原生的方式来实现这种转变?我是手动创建转换后的Dataframe,但这是减慢速度的方法。

先感谢您!


问题答案:

使用get_dummiesmax

df = pd.get_dummies(df.set_index('Col 1')['Col 2'], dtype=bool).rename_axis(None).max(level=0)
print (df)
       1     2      3
A  False  True   True
B   True  True  False

或者,如果可能的话,不要在列中丢失任何值,Col2然后DataFrame.pivot与一起使用DataFrame.notna,以删除索引和列名,请使用DataFrame.rename_axis

df = df.pivot('Col 1', 'Col 2', 'Col 1').notna().rename_axis(index=None, columns=None)
print (df)
       1     2      3
A  False  True   True
B   True  True  False

备选方案可能是重复项,但pivot失败了:

df = (df.pivot_table(index='Col 1', columns='Col 2', values='Col 1', aggfunc='size')
        .notna()
        .rename_axis(index=None, columns=None))
print (df)
       1     2      3
A  False  True   True
B   True  True  False

或评论中的解决方案:

df = (pd.crosstab(df['Col 1'], df['Col 2'])
        .gt(0)
        .rename_axis(index=None, columns=None))