我有一个带有user_id和类别的df.我想将此转换为真值表,以确定该用户是否至少有一个该类别的条目.但是,最终表还应包含“df_list”中出现的所有类别的列,这些列可能根本不会出现在df中.
现在我使用groupby大小创建真值表,然后检查是否缺少任何列,然后手动将这些列设置为False,但我想知道是否有一种方法可以在初始groupby步骤中完成此操作.
这是一个例子:
import pandas as pd
df = pd.DataFrame({'user_id': [1,1,1,2,2],
'category': ['A', 'B', 'D', 'A', 'F']})
df_list = pd.DataFrame({'category': ['A', 'B', 'C', 'D', 'E', 'F']})
df_truth = df.groupby(['user_id', 'category']).size().unstack(fill_value=0).astype(bool)
#category A B D F
#user_id
#1 True True True False
#2 True False False True
然后到达所需的输出然后我做:
missing_vals = df_list.category.unique()[~pd.Series(df_list.category.unique()).isin(df_truth.columns)]
for element in missing_vals:
df_truth.loc[:,element] = False
#category A B D F C E
#user_id
#1 True True True False False False
#2 True False False True False False
解决方法:
选项1
交叉表
我建议将该列转换为分类dtype.然后交叉表/枢轴将处理其余部分.
i = df.user_id
j = pd.Categorical(df.category, categories=df_list.category)
pd.crosstab(i, j).astype(bool)
col_0 A B C D E F
user_id
1 True True False True False False
2 True False False False False True
选项2
unstack reindex
要修复现有代码,可以使用reindex简化第二步:
(df.groupby(['user_id', 'category'])
.size()
.unstack(fill_value=0)
.reindex(df_list.category, axis=1, fill_value=0)
.astype(bool)
)
category A B C D E F
user_id
1 True True False True False False
2 True False False False False True
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。