Pandas 按条件分组并计算项目数量

Jia*_*iao 4 python dataframe pandas

我有一个像这样的数据框:

df_test = pd.DataFrame({'ID1':['A','A','A','A','A','A','B','B','B','B'],
                       'ID2':['a','a','a','aa','aaa','aaa','b','b','bb','bb'],
                       'ID3':['c1','c2','c3','c4','c5','c6','c7','c8','c9','c10'],
                       'condition':['','!','','!','','','!','','','!']})
Run Code Online (Sandbox Code Playgroud)

df_测试

我想按 ID1 对它们进行分组。对于每个 ID2 组,结果数据帧需要像这样(count_condition 表示“!”的数量):

df_test_result = pd.DataFrame({'ID1':['A','A','A','B','B'],
                       'ID2':['a','aa','aaa','b','bb'],
                        'Count_ID2':[3,1,2,2,2],
                        'Count_ID3':[3,1,2,2,2],
                        'Count_condition': [1,1,0,1,1]})
Run Code Online (Sandbox Code Playgroud)

df_测试_结果

我尝试使用groupby和agg来获得这个结果,但我无法获得'!'的数量 对于每个组。这是我的命令

df_test_result = df_test.groupby(['ID1','ID2']).agg({'ID2':'count','ID3':'nunique','condition':'count'})
Run Code Online (Sandbox Code Playgroud)

如果有一种这样的命令是错误的:

df_test = df_test.groupby(['ID1','ID2']).agg({'ID2':'count','ID3':'nunique','condition' == '!':'count'})
Run Code Online (Sandbox Code Playgroud)

sop*_*les 6

您可以使用命名的groupby

df_test.groupby(
    ['ID1','ID2']).agg(
    Count_ID2=('ID2', 'count'),
    Count_ID3=('ID3', 'count'),
    Count_condition=("condition", lambda x: str(x).count('!')))
Run Code Online (Sandbox Code Playgroud)

印刷:

         Count_ID2  Count_ID3  Count_condition
ID1 ID2                                       
A   a            3          3                1
    aa           1          1                1
    aaa          2          2                0
B   b            2          2                1
    bb           2          2                1
Run Code Online (Sandbox Code Playgroud)

在上面,我们计算列“ID2”和“ID3”的出现次数,并创建一个小的自定义函数来计算“条件”列aggfunc="count"的出现次数。!我们对每个组执行上述操作,并为聚合结果返回命名列

  • 请注意,您不需要 `pd.NamedAgg`,您可以使用元组:`Count_ID2=('ID2', 'count')` 等;) (2认同)