我將行附加到資料框中,并有一個 id 列,該列需要根據 DataFrame 中的現有值是唯一的。
對于新行,我想添加一個 id。
這是示例起始資料(新添加的第 2 行和第 3 行)
| 姓名 | ID | |
|---|---|---|
| 0 | 一種 | 65 |
| 1 | F | 33 |
| 2 | H | 0 |
| 3 | 五 | 0 |
資料沒有順序,并且之前可能分配的 id 不是順序的。我只想從最高 id 開始并從那里增加。
| 姓名 | ID | |
|---|---|---|
| 0 | 一種 | 65 |
| 1 | F | 33 |
| 2 | H | 66 |
| 3 | 五 | 67 |
我已經實作如下
max_id = df[id_field].max()
for i in df.index:
if df.at[i, id_field] == 0:
max_id = 1
df.at[i, id_field] = max_id
我不得不這樣做,因為我無法更新max_id內部理解。這感覺不像蟒蛇。我可以用更優雅的方式做到這一點嗎?使用 lambdas 或理解?謝謝
uj5u.com熱心網友回復:
在您的情況下,我們可能需要使用groupbywithcumcount來獲得增加并cummax獲得最大值
x = df.id.ne(0).cumsum()
df.loc[df.id==0,'id'] = df.id.cummax() x.groupby(x).cumcount()
df
Out[561]:
name id
0 A 65
1 F 33
2 H 66
3 V 67
uj5u.com熱心網友回復:
這是一個使用的想法factorize:
# identify values to replace
m = df['id'].eq(0)
# compute a factor and add the max 1
df.loc[m, 'id'] = df.loc[m, 'name'].factorize()[0] df['id'].max() 1
或使用cumsum:
# identify values to replace
m = df['id'].eq(0)
# replace by max cumsum of boolean
df.loc[m, 'id'] = df['id'].max() m.cumsum()
輸出:
name id
0 A 65
1 F 33
2 H 66
3 V 67
uj5u.com熱心網友回復:
海象運算子將允許您在推導式中進行更新max_id:
import pandas as pd
df = pd.DataFrame({'name':["A","F","H","V"], 'id':[65,33,0,0]})
print(df)
max_id = df['id'].max()
df.loc[df['id'] == 0, 'id'] = [(max_id := max_id 1) for _ in range(sum(df['id']==0))]
print(df)
輸出:
name id
0 A 65
1 F 33
2 H 0
3 V 0
name id
0 A 65
1 F 33
2 H 66
3 V 67
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/454539.html
上一篇:將資料框列映射到另一個資料框
