groupby lambda 并填充空行

时间:2021-06-04 15:50:28

标签: python pandas

status  name    date        count  pass_count
pass    john    2003-04-22  4       2
fail    cici    2003-04-22  4       1
pass    john    2004-04-22  4       2
pass    john    2004-04-22  4       2
fail    lily    2006-05-23  3       0
        lily    2006-05-23  3       0
pass    cici    2008-05-23  3       1
        cici    2008-05-23  3       0

我有一个数据框,我正在尝试返回列 pass_count。

首先按名称分组,其次检查状态并计算给定名称通过的数量。

我的代码:

df['pass_count'] = df.groupby(['name'])['status'].apply(lambda x: x == 'Pass')

代码不起作用,我尝试使用 fillna('NaN')fillna('0') 填充空的“状态”行,但空的“状态”行仍然存在?

有人知道如何修复此代码吗?

2 个答案:

答案 0 :(得分:1)

假设您的数据框还没有 df.drop('pass_count', axis=1) 列(如果有,只需使用 npass = df.groupby('name')['status'].apply(lambda x: len(x[x == 'pass'])) npass = npass.to_frame(name='pass_count').reset_index() 删除它。

现在让我们计算传递次数并将其放入数据帧中:

In [127]: npass
Out[127]: 
   name  pass_count
0  cici           1
1  john           3
2  lily           0

我们现在有以下数据框,其中包含与每个名称相关联的正确计数:

In [128]: pd.merge(df, npass)
Out[128]: 
  status  name        date  count  pass_count
0   pass  john  2003-04-22      4           3
1   pass  john  2004-04-22      4           3
2   pass  john  2004-04-22      4           3
3   fail  cici  2003-04-22      4           1
4   pass  cici  2008-05-23      3           1
5    NaN  cici  2008-05-23      3           1
6   fail  lily  2006-05-23      3           0
7    NaN  lily  2006-05-23      3           0

剩下要做的就是合并两个数据框:

pass_count

并且您在数据框中有 git commit -m "Some commit message" 列。

答案 1 :(得分:1)

您的代码缺少 transform(),它返回与原始对象长度相同的 DataFrame。

df['pass_count'] = df.groupby('name')['status'].transform(lambda x: len(x[x == 'pass']))

要填充空的状态列,可能是您的数据包含空格,因此您可以使用:

df['status'].replace(r'^\s+$', np.nan, regex=True,inplace=True) 

产生的结果:

  status  name        date  count  pass_count
0   pass  john  22/04/2003      4           3
1   fail  cici  22/04/2003      4           1
2   pass  john  22/04/2004      4           3
3   pass  john  22/04/2004      4           3
4   fail  lily  23/05/2006      3           0
5    NaN  lily  23/05/2006      3           0
6   pass  cici  23/05/2008      3           1
7    NaN  cici  23/05/2008      3           1