[英]Replacing the last row value of a specific column value
我有一個 dataframe df
看起來像這樣:
鑰匙 | ID |
---|---|
X | 0.6 |
X | 0.5 |
X | 0.43 |
X | 0.56 |
是 | 13 |
是 | 14 |
是 | 0.4 |
是 | 0.1 |
我想用 0 替換每個key
的最后一個值,這樣 df 看起來像這樣:
鑰匙 | ID |
---|---|
X | 0.6 |
X | 0.5 |
X | 0.43 |
X | 0 |
是 | 13 |
是 | 14 |
是 | 0.4 |
是 | 0 |
我試過以下方法:
for i in df['key'].unique():
df.loc[df['key'] == i, 'id'].iat[-1] = 0
問題是它不會替換 df 中的實際值。 我錯過了什么? 也許有更好的(性能)方法來解決這個問題。
使用Series.duplicated
獲取每個key
的最后一個值並在DataFrame.loc
中設置0
:
df.loc[~df['key'].duplicated(keep='last'), 'id'] = 0
print (df)
key id
0 x 0.60
1 x 0.50
2 x 0.43
3 x 0.00
4 y 13.00
5 y 14.00
6 y 0.40
7 y 0.00
它是如何工作的:
print (df.assign(mask=df['key'].duplicated(keep='last'),
invert_mask=~df['key'].duplicated(keep='last')))
key id mask invert_mask
0 x 0.60 True False
1 x 0.50 True False
2 x 0.43 True False
3 x 0.00 False True
4 y 13.00 True False
5 y 14.00 True False
6 y 0.40 True False
7 y 0.00 False True
另一種解決方案是使用 boolean 掩碼的多個id
列:
df['id'] = df['key'].duplicated(keep='last').mul(df['id'])
print (df)
key id
0 x 0.60
1 x 0.50
2 x 0.43
3 x 0.00
4 y 13.00
5 y 14.00
6 y 0.40
7 y 0.00
您可以使用groupby.cumcount
從末尾訪問每個組的第 n 行(使用ascending=False
)和boolean 索引:
df.loc[df.groupby('key').cumcount(ascending=False).eq(0), 'id'] = 0
output:
key id
0 x 0.60
1 x 0.50
2 x 0.43
3 x 0.00
4 y 13.00
5 y 14.00
6 y 0.40
7 y 0.00
中間的:
key id cumcount eq(0)
0 x 0.60 3 False
1 x 0.50 2 False
2 x 0.43 1 False
3 x 0.56 0 True
4 y 13.00 3 False
5 y 14.00 2 False
6 y 0.40 1 False
7 y 0.10 0 True
您可以輕松適應任何行,例如每組倒數第二行:
df.loc[df.groupby('key').cumcount(ascending=False).eq(1), 'id'] = 0
對於每組的第三行:
df.loc[df.groupby('key').cumcount().eq(2), 'id'] = 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.