我正在處理熊貓資料框,并有一個像這樣的框架:
data = {
"name": ["Andrew", "Andrew", "James", "James", "Mary", "Andrew", "Michael"],
"id": [3, 3, 1, 0, 0, 0, 2]
}
df = pd.DataFrame(data)
----------------------
name id
0 Andrew 3
1 Andrew 3
2 James 1
3 James 0
4 Mary 0
5 Andrew 0
6 Michael 2
我正在嘗試撰寫代碼以按“名稱”列對值進行分組。但是,我想保留當前的組號。如果值為0,則表示沒有賦值。對于上面的示例,為每次出現的 Andrew分配值3 ,為每次出現的 James分配值1 。對于 Mary,沒有分配,因此分配下一個/唯一編號。
預期輸出:
name id
0 Andrew 3
1 Andrew 3
2 James 1
3 James 1
4 Mary 4
5 Andrew 3
6 Michael 2
我已經花時間試圖弄清楚這一點。我設法做到了這樣的事情:
df.loc[df["id"].eq(0), "id"] = ( df['name'].rank(method='dense').astype(int))
上面的問題是它忽略了等于 0 的記錄,因此數字不正確。我洗掉了該部分(值等于 0),但沒有保留編號。
你能支持我嗎?
uj5u.com熱心網友回復:
將0值替換為缺失值,因此如果使用GroupBy.transformwithfirst獲取所有現有值而不是它們,然后Series.rank用添加最大值替換缺失值id并轉換為整數:
df = df.replace({'id':{0:np.nan}})
df['id'] = df.groupby('name')['id'].transform('first')
s = df.loc[df["id"].isna(), 'name'].rank(method='dense') df['id'].max()
df['id'] = df['id'].fillna(s).astype(int)
print (df)
name id
0 Andrew 3
1 Andrew 3
2 James 1
3 James 1
4 Mary 4
5 Andrew 3
6 Michael 2
uj5u.com熱心網友回復:
IIUC 您可以首先填寫非零 IDgroupby.transform('max')以獲得最大現有 ID,然后將沒有 ID 的名稱填寫到屏蔽資料上的下一個可用 ID(您可以使用factorize或rank根據需要):
# fill existing non-zero IDs
s = df.groupby('name')['id'].transform('max')
m = s.eq(0)
df['id'] = s.mask(m)
# add new ones
df.loc[m, 'id'] = pd.factorize(df.loc[m, 'name'])[0] df['id'].max() 1
# or rank, although factorize is more appropriate for non numerical data
# df.loc[m, 'id'] = df.loc[m, 'name'].rank(method='dense') df['id'].max()
# optional, if you want integers
df['id']= df['id'].convert_dtypes()
輸出:
name id
0 Andrew 3
1 Andrew 3
2 James 1
3 James 1
4 Mary 4
5 Andrew 3
6 Michael 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/458745.html
