【问题标题】:How to make a binary cross validation table from a pivot table using Pandas如何使用 Pandas 从数据透视表制作二进制交叉验证表
【发布时间】:2021-11-01 22:10:33
【问题描述】:
我有一个如下所示的数据集
当我进行旋转时,它应该看起来像这样
但我真正想要的是这个
我可以用循环和东西以一种不漂亮和直观的方式来完成它......就像我可以搜索不是 None 类型的值,然后用 True 和 ifnot False 替换。但这又不是很漂亮,如果我在大型数据集上执行它可能需要一些时间(情况就是这样)。
所以我想知道我是否可以用单行或几行以更漂亮和更快的方式完成。
谢谢!
【问题讨论】:
标签:
python
pandas
numpy
pivot
mask
【解决方案1】:
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
【解决方案2】:
来自您的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
【解决方案3】:
您可以只使用isna() 方法,如下所示:
new_df = ~df.isna()