如何使用 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
我的数据集如下所示
当我做 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