首页 > 解决方案 > Groupby 基于多个逻辑条件应用于不同的列 DataFrame

问题描述

我有这个数据框:

df = pd.DataFrame({'value':[1,2,3,4,2,42,12,21,21,424,34,12,42],
'type':['big','small','medium','big','big','big','big','medium','small','small','small','medium','small'],
'entity':['R','R','R','P','R','P','P','P','R','R','P','R','R']})

    value    type  entity
0       1     big       R
1       2   small       R
2       3  medium       R
3       4     big       P
4       2     big       R
5      42     big       P
6      12     big       P
7      21  medium       P
8      21   small       R
9     424   small       R
10     34   small       P
11     12  medium       R
12     42   small       R

该操作包括按列“实体”分组,根据应用于列“值”和列“类型”的两个逻辑条件进行计数操作。就我而言,我必须在“名称”列中计算大于 3 的值,并且在“类型”列中不等于“中”。结果必须是 R=3 和 P=4。在此之后,我必须将结果添加到原始数据框中,创建一个名为“计数”的新列。我知道这个操作可以在 R 中用下面的代码完成:

df[y!='medium' & value>3 , new_var:=.N,by=entity]
df[is.na(new_var),new_var:=0,]
df[,new_var:=max(new_var),by=entity]

在之前的任务中,我只需要计算大于 3 的值作为条件。在那种情况下,结果是 R=3 和 P=4,我得到它应用下一个代码:

In []:  df.groupby(['entity'])['value'].apply(lambda x: (x>3).sum())

Out[]:  entity
        P    5
        R    4
        Name: value, dtype: int64

In []:  DF=pd.DataFrame(DF)
In []:  DF.reset_index(inplace=True)
In []:  df.merge(DF,on=['entity'],how='inner')
In []:  df=df.rename(columns={'value_x':'value','value_y':'count'},inplace=True)
Out[]:  

    value   type     entity  count
0      1     big          R      4
1      2   small          R      4
2      3  medium          R      4
3      2     big          R      4
4     21   small          R      4
5    424   small          R      4
6     12  medium          R      4
7     42   small          R      4
8      4     big          P      5
9     42     big          P      5
10    12     big          P      5
11    21  medium          P      5
12    34   small          P      5

我的问题是:我该如何处理这两种情况?实际上,对于具有多个不同条件的一般情况,我该如何做?

标签: pythonpandas

解决方案


根据您的条件创建掩码 - 这里更大 bySeries.gt不等于 bySeries.ne链式 by&按位AND,然后使用GroupBy.transformfor count Trues by sum

mask = df['value'].gt(3) & df['type'].ne('medium')
df['count'] = mask.groupby(df['entity']).transform('sum')

带有辅助列的解决方案new

mask = df['value'].gt(3) & df['type'].ne('medium')
df['count'] = df.assign(new = mask).groupby('entity')['new'].transform('sum')

print (df)
    value    type entity  count
0       1     big      R      3
1       2   small      R      3
2       3  medium      R      3
3       4     big      P      4
4       2     big      R      3
5      42     big      P      4
6      12     big      P      4
7      21  medium      P      4
8      21   small      R      3
9     424   small      R      3
10     34   small      P      4
11     12  medium      R      3
12     42   small      R      3

推荐阅读