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')
填充空的“状态”行,但空的“状态”行仍然存在?
有人知道如何修复此代码吗?
答案 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