我有一个Pandas DataFrame,如下所示:
status nb_success id
ok 0 A
ok 0 A
ok 0 A
nok 0 B
我希望每次ok
为id
时递增nb_success
,以计算每status
个ok
状态的数量。
所以,我想得到的结果是以下数据帧:
status nb_success id
ok 0 A
ok 1 A
ok 2 A
nok 0 B
对我来说,最好的方法是使用df.apply,我已经这样做了:
def update_count(nb_success, status):
if status is 'ok':
return nb_success + 1
dataframe['nb_success'] = dataframe.apply(lambda row: update_count(row['nb_success'], row['status']), axis=1)
但是当我尝试print
所有nb_success != 0
行时,我得到一个空数据帧。
print(dataframe.loc[dataframe['nb_success'] != 0])
我在这里做错了什么?
答案 0 :(得分:3)
最好使用loc
与cumsum
布尔掩码 - True
值转换为1
,得到系列1,2,3...
,因此需要减去{{ 3}}:
mask = df['status'] == 'ok'
df.loc[mask, 'nb_success'] = mask.cumsum() - 1
print (df)
status nb_success id
0 ok 0 A
1 ok 1 A
2 ok 2 A
3 nok 0 B
或使用sub
:
mask = df['status'] == 'ok'
df['nb_success']= df['nb_success'].mask(mask, mask.cumsum() - 1)
print (df)
status nb_success id
0 ok 0 A
1 ok 1 A
2 ok 2 A
3 nok 0 B
mask
的解决方案 - 有点过于复杂:
我认为你需要cumcount
:
df ['nb_success']= df['nb_success'].mask(df['status'] == 'ok',
df.groupby('status')['nb_success'].cumcount())
print (df)
status nb_success id
0 ok 0 A
1 ok 1 A
2 ok 2 A
3 nok 0 B
与mask
类似的解决方案:
mask = df['status'] == 'ok'
df.loc[mask, 'nb_success']= df[mask].groupby('status')['nb_success'].cumcount()
print (df)
status nb_success id
0 ok 0 A
1 ok 1 A
2 ok 2 A
3 nok 0 B
答案 1 :(得分:0)
success_count = 0
def update_count(nb_success, status):
global success_count
if status is 'ok':
success_count += 1
return success_count
dataframe['nb_success'] = dataframe.apply(lambda row: update_count(row['nb_success'], row['status']), axis=1)
测试这个