基于Pandas DataFrame中的列更改行值时出现问题

时间:2017-06-23 10:07:15

标签: python pandas dataframe

我有一个Pandas DataFrame,如下所示:

status    nb_success     id 
    ok             0      A
    ok             0      A 
    ok             0      A
    nok            0      B

我希望每次okid时递增nb_success,以计算每statusok状态的数量。 所以,我想得到的结果是以下数据帧:

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])

我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

最好使用loccumsum布尔掩码 - 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)

测试这个