簡體   English   中英

替換特定列值的最后一行值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM