gpt4 book ai didi

python - pandas groupby 基于唯一值扩展 df

转载 作者:行者123 更新时间:2023-12-04 09:59:03 25 4
gpt4 key购买 nike

我有 df以下:

df = pd.DataFrame({
'ID': ['a', 'a', 'a', 'b', 'c', 'c'],
'V1': [False, False, True, True, False, True],
'V2': ['A', 'B', 'C', 'B', 'B', 'C']
})

我想实现以下目标。对于每个独特的 ID ,底行是 True (这是 V1 )。我想计算 V2 的每个唯一值有多少次发生在 V1==True .这部分将通过以下方式实现:
df.groupby('V2').V1.sum()

但是,我还想添加,对于 V2 的每个唯一值,一列指示该值在 V1==True 点之后出现的次数为 V2行表示的值。我知道这听起来可能令人困惑;下面是这个例子中输出的样子:
df
V2 V1 A B C
0 A 0 0 0 0
1 B 1 0 0 0
2 C 2 1 2 0

重要的是,该解决方案足够通用以适用于具有更多唯一值的类似情况,而不仅仅是 A , BC .

更新

作为奖励,我也对如何在相同条件下返回某个值列的总和,而不是计数,除以相应的 "count" 感兴趣。在行中。示例:假设我们现在离开 df下面改为:
df = pd.DataFrame({
'ID': ['a', 'a', 'a', 'b', 'c', 'c'],
'V1': [False, False, True, True, False, True],
'V2': ['A', 'B', 'C', 'B', 'B', 'C'],
'V3': [1, 2, 3, 4, 5, 6],
})

输出需要求和 V3对于@jezrael 解决方案中计数所指示的情况,将该数字除以 V1 .输出将如下所示:
df
V2 V1 A B C
0 A 0 0 0 0
1 B 1 0 0 0
2 C 2 1 3.5 0

最佳答案

第一集sum :

df1 = df.groupby('V2').V1.sum().astype(int).reset_index()
print (df1)
V2 V1
0 A 0
1 B 1
2 C 2

然后按 ID 分组并通过 GroupBy.transform 按最后一个值创建 heper 列和 last ,然后删除 ID 的最后几行来自 Series.duplicated 并使用 crosstab 对于计数,添加所有可能的唯一值 V2最后追加到 df1来自 DataFrame.join :
val = df['V2'].unique()
df['new'] = df.groupby('ID').V2.transform('last')
df = df[df.duplicated('ID', keep='last')]

df = pd.crosstab(df['new'], df['V2']).reindex(columns=val, index=val, fill_value=0)

df = df1.join(df, on='V2')
print (df)
V2 V1 A B C
0 A 0 0 0 0
1 B 1 0 0 0
2 C 2 1 2 0

更新

问题的更新部分应该可以通过更改 crosstab 来实现部分与 pivot table :
df = df.pivot_table(
index='n',
columns='V2',
aggfunc=({
'V3': 'mean'
})
).V3.reindex(columns=v, index=v, fill_value=0)

关于python - pandas groupby 基于唯一值扩展 df,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61868871/

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