Pandas:转换数据帧以显示原始数据帧中是否存在值的组合

Ced*_*dd0 5 python pandas

我有一个如下所示的数据框:

 | Col 1 | Col 2 | 
0|   A   |   2   |
1|   A   |   3   |
2|   B   |   1   |
3|   B   |   2   |
Run Code Online (Sandbox Code Playgroud)

如果原始数据帧中包含第 1 列和第 2 列中的值,我需要将其转换为显示每个组合的数据帧:

  |  1  |  2  |  3  |
A |False|True |True |
B |True |True |False|
Run Code Online (Sandbox Code Playgroud)

大熊猫是否有一种本地方式来获得这种转变?我正在手动创建转换后的数据帧,但这是减慢速度的方法。

先感谢您!

lui*_*igi 5

你可以使用:

df.groupby(['Col 1','Col 2']).size().unstack(fill_value=0).astype(bool)

Col2      1     2      3
Col1                    
A     False  True   True
B      True  True  False
Run Code Online (Sandbox Code Playgroud)


opp*_*yer 5

这是一个枢轴解决方案:

(df.pivot('Col 1', 'Col 2', 'Col 1').fillna(0) != 0).rename_axis(index=None, columns=None)
Run Code Online (Sandbox Code Playgroud)
         1     2      3
A      False  True   True
B       True  True  False
Run Code Online (Sandbox Code Playgroud)


jez*_*ael 2

get_dummies与以下一起使用max

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
Run Code Online (Sandbox Code Playgroud)

或者,如果可能列中不缺少值,Col2则使用DataFrame.pivotwithDataFrame.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
Run Code Online (Sandbox Code Playgroud)

另一种可能是重复并且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
Run Code Online (Sandbox Code Playgroud)

或者评论中的解决方案:

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