如何使用 Pandas 从枢轴 table 进行二进制交叉验证 table

How to make a binary cross validation table from a pivot table using Pandas

我的数据集如下所示

当我做 pivot 时,它应该是这样的

但我真正想要的是这个

我可以用有点手动的方式使用循环和东西来完成它,这不是很直观...就像我可以搜索不是 None 类型的值,然后用 True 和 ifnot False 替换。但这又不是很漂亮,如果我在大型数据集上执行它可能需要一些时间(情况就是如此)。

所以我想知道我是否可以用一行或几行以更漂亮和更快的方式来完成。

谢谢!

您可以只使用 isna() 方法,如下所示:

new_df = ~df.isna()

来自您的 DataFrame :

import pandas as pd
from io import StringIO

df = pd.read_csv(StringIO("""
ID,ISIN
AXAMIL,A
AXAMIL,B
AXAMIL,C
AXAEXL,D
UNPEVL,A
UNPEVL,E
UNPMSP,A
UNPMSP,B"""), sep=',')
df

我们可以使用 groupby,然后 unstack 结果并将其转换为 boolean 以获得预期结果:

>>> df.groupby(['ID', 'ISIN']).size().unstack(fill_value=0).astype(bool).rename_axis(None, axis=1).reset_index()
    ID      A       B       C       D       E
0   AXAEXL  False   False   False   True    False
1   AXAMIL  True    True    True    False   False
2   UNPEVL  True    False   False   False   True
3   UNPMSP  True    True    False   False   False

pandas.DataFrame.pivot_table 就是您要找的。 assign 只是为聚合创建虚拟变量。

df = (
    df.assign(**{"": 1})
      .pivot_table(
          index="ID", 
          columns="ISIN", 
          aggfunc="max", 
          fill_value=0,
      ).astype(bool)
)

输出:

ISIN        A      B      C      D      E
ID
AXAEXL  False  False  False   True  False
AXAMIL   True   True   True  False  False
UNPEVL   True  False  False  False   True
UNPMSP   True   True  False  False  False