按Pandas分组后列值的子计数

fwzugrvs  于 2023-03-11  发布在  其他
关注(0)|答案(4)|浏览(108)

我有这样一个 Dataframe :

df = pd.DataFrame({
  'org':['a','a','a','a','b','b'],
  'product_version':['bpm','bpm','bpm','bpm','ppp','ppp'],
  'release_date':['2022-07','2022-07','2022-07','2022-07','2022-08','2022-08'],
  'date_avail':['no','no','no','yes','no','no'],
  'status':['green','green','yellow','yellow','green','green']
})

看起来像这样

org product_version release_date date_avail  status
0   a             bpm      2022-07         no   green
1   a             bpm      2022-07         no   green
2   a             bpm      2022-07         no  yellow
3   a             bpm      2022-07        yes  yellow
4   b             ppp      2022-08         no   green
5   b             ppp      2022-08         no   green

我希望得到按列['org','product_version','release_date']分组后的总计数,这很简单:

print(df.groupby(['org','product_version','release_date']).size())

org  product_version  release_date
a    bpm              2022-07         4
b    ppp              2022-08         2

然而,我还想从这个组中获取未分组的其他列的不同值的子计数。例如,具有4作为总计数的第一组是a bpm 2022-07。对于列date_avail,该组具有3no1yes;对于列status,该组具有2green2yellow
因此,我所需的表结果如下所示:

org product release_date total number_of_no number_of_yes number_of_green number_of_yellow
a   bpm     2022-07      4     3             1            2               2
b   ppp     2022-08      2     2             0            2               0
lkaoscv7

lkaoscv71#

您可以在分组的 Dataframe 中使用agg方法来计算每个组的多个聚合函数。假设唯一可能的颜色是绿色和黄色,则如下所示:

grouped = df.groupby(['org', 'product_version', 'release_date'])
result = grouped.agg(
    total=('org', 'count'),
    number_of_no=('date_avail', lambda x: (x == 'no').sum()),
    number_of_yes=('date_avail', lambda x: (x == 'yes').sum()),
    number_of_green=('status', lambda x: (x == 'green').sum()),
    number_of_yellow=('status', lambda x: (x == 'yellow').sum())
).reset_index()

print(result)

输出:

org product_version release_date  total  number_of_no  number_of_yes  number_of_green  number_of_yellow
0   a             bpm      2022-07      4             3              1                2                 2
1   b             ppp      2022-08      2             2              0                2                 0
7ivaypg9

7ivaypg92#

您可以使用value_countsgroupby

groupby_cols = ["org", "product_version", "release_date"]
g = df.groupby(groupby_cols)
out = pd.concat(
    [
        g[col].value_counts().unstack()
        for col in df.columns.drop(groupby_cols)
    ]
).fillna(0).groupby(groupby_cols).sum().reset_index().assign(total=g.size().values)
print(out)


  org product_version release_date   no  yes  green  yellow  total
0   a             bpm      2022-07  3.0  1.0    2.0     2.0      4
1   b             ppp      2022-08  2.0  0.0    2.0     0.0      2

而且你不需要担心要聚合和求和的列中的值,你只需要使用value_counts就可以了。
或者您可以像这样使用pd.crosstab

index_series = [df[col] for col in groupby_cols]
columns_series = [df[col] for col in other_cols]
ct = pd.crosstab(index_series, columns_series)
out = pd.concat(
    [ct.groupby(level=l, axis=1).sum() for l in range(ct.columns.nlevels)], axis=1
).assign(total=df.groupby(groupby_cols).size().values)
print(out)

  org product_version release_date  no  yes  green  yellow  total
0   a             bpm      2022-07   3    1      2       2      4
1   b             ppp      2022-08   2    0      2       0      2
ncgqoxb0

ncgqoxb03#

下面是使用pd.get_dummies()的方法

c = ['org','product_version','release_date']

df2 = pd.get_dummies(df,columns = df.columns.difference(c))

df2.groupby(c).agg(**{i:(i,'sum') for i in df2.columns.difference(c)},count = ('org','count')).reset_index()
qoefvg9y

qoefvg9y4#

使用单个df.groupby,并使用每个组的 * 总计 * 和 * 值计数 * 构造内部pd.Series

cols = ['org','product_version','release_date']
res = df.groupby(cols).apply(lambda x: pd.Series({'total': x.index.size}
                                                 | {k: v for c in x.columns[~x.columns.isin(cols)]
                                                  for k, v in x[c].value_counts().to_dict().items()})
                             .to_frame().T).droplevel(len(cols)).reset_index().fillna(0)
print(res)
org product_version release_date  total  no  yes  green  yellow
0   a             bpm      2022-07      4   3  1.0      2     2.0
1   b             ppp      2022-08      2   2  0.0      2     0.0

相关问题