根据熊猫数据框中的特定ID更改列的值

时间:2020-08-25 20:52:42

标签: python pandas dataframe

我具有以下排序的数据框,我想将 id列中每个 id 的最后一个值设置为 0

id value
1   500
1   50
1   36
2   45
2   150
2   70
2   20
2   10

我可以使用df['value'].iloc[-1] = 0将整个 id列的最后一个值设置为0。如何设置 id:1 id:2 的最后一个值,以获取以下输出。

id value
1   500
1   50
1   0
2   45
2   150
2   70
2   20
2   0

3 个答案:

答案 0 :(得分:4)

您可以执行drop_duplicates并保留最后一个以获得每个ID的最后一行。使用这些行中的index并将值设置为0

df.loc[df['id'].drop_duplicates(keep='last').index, 'value'] = 0

print(df)
   id  value
0   1    500
1   1     50
2   1      0
3   2     45
4   2    150
5   2     70
6   2     20
7   2      0

答案 1 :(得分:4)

 df.loc[~df.id.duplicated('last'),'value']=0

细分

    m=df.id.duplicated('last')
    
    df.loc[~m,'value']=0




id  value
0   1    500
1   1     50
2   1      0
3   2     45
4   2    150
5   2     70
6   2     20
7   2      0

工作方式

m=df.id.duplicated('last')# Selects the last duplicated in column id

~m reverses that and hence last duplicated becomes true

df.loc[~m,'value']# loc accessor allows us to reach the True value in the nominated column to write with 0

答案 2 :(得分:1)

如果您愿意使用numpy,这是一个快速的解决方案:

import numpy as np

# Recreate example
df = pd.DataFrame({
    "id":[1,1,1,2,2,2,2,2],
    "value": [500,50,36,45,150,70,20,10]
})
# Solution
df["value"] = np.where(~df.id.duplicated(keep="last"),0,df["value"].to_numpy())