gpt4 book ai didi

python - 如何将一个 DataFrame 列转换为包含基于另一个 DataFrame 的列的真值表?

转载 作者:太空狗 更新时间:2023-10-30 02:53:24 24 4
gpt4 key购买 nike

我有一个 df,带有一个 user_id 和一个 category。我想将其转换为真值表,以确定该用户是否至少拥有该类别的一个条目。但是,最终表还应包含出现在“df_list”中的所有类别的列,这些列可能根本不会出现在 df 中。

现在我使用 groupby + size 创建真值表,然后检查是否缺少任何列,然后手动将这些列设置为 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
交叉表
我建议将该列转换为分类数据类型。 crosstab/pivot 将处理其余部分。

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

关于python - 如何将一个 DataFrame 列转换为包含基于另一个 DataFrame 的列的真值表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49593222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com