我具有以下排序的数据框,我想将 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
答案 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())