在 Pandas 数据框中,如何根据特定 ID 更改列的值?

4
我有下面已排序的数据框,我想将每个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 : 1id : 2 的最后一个值,以获得下面的输出。

id value
1   500
1   50
1   0
2   45
2   150
2   70
2   20
2   0
3个回答

5
您可以使用 drop_duplicates 函数并选择参数 "keep last" 来获取每个id的最后一行数据。使用这些行的索引将值设置为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

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

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

如果id:1 > 100且id:2 < 100,则将值设置为二进制1,否则如果id:1 < 101且id:2 > 99,则将值设置为二进制0。 我尝试添加一个新的列“threshold”。是否有更有效的解决方案?如何在不添加新列的情况下实现这一点。rindx = df[((df['id'] == 1) & (df['value'] > 100)) | ((df['id'] == 2) & (df['value'] < 100))].index df.loc[rindx, 'threshold'] = 1 rindx = df[((df['id'] == 1) & (df['value'] < 101)) | ((df['id'] == 2) & (df['value'] > 99))].index df.loc[rindx, 'threshold'] = 0 - GKC
预期输出:id 值 1 1 1 0 1 0 2 1 2 0 2 1 2 1 2 0 - GKC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接