我想使用熊貓轉換資料框。
舊資料框:
| 人名 | 參考 ID | 姓名 |
|---|---|---|
| 1 | 1 | 最大限度 |
| 2 | 1 | 凱文 |
| 3 | 1 | 薩拉 |
| 4 | 4 | 切西 |
| 5 | 9 | 費爾南多 |
轉換為以下格式的新資料幀。
新資料框:
| 人名 | 參考 ID | 會員1 | 會員2 | 會員3 |
|---|---|---|---|---|
| 1 | 1 | 最大限度 | 凱文 | 薩拉 |
| 4 | 4 | 切西 | ||
| 5 | 9 | 費爾南多 |
我的解決方案是:
- 將舊資料幀中的所有參考 ID 寫入新資料幀
- 將舊資料幀中的所有人員 ID 寫入新資料幀,它們的 reference_id 不在舊資料幀中(參見示例 Fernando)
- 回圈遍歷“舊”資料幀并將名稱添加到新資料幀中的相應行
你有什么建議,如何使這更快/更簡單?
PS:舊資料框可以這樣制作
person_id = [1,2,3,4,5]
reference_id = [1,1,1,4,9]
name = ['Max','Kevin','Sara',"Chessi","Fernando"]
list_tuples=list(zip(person_id,reference_id,name))
old_dataframe = pd.DataFrame(list_tuples,columns=['Person_ID','Reference_id','Name'])
uj5u.com熱心網友回復:
一種方法是groupby.agg首先然后concat結果:
df = (df.groupby("Reference_id", as_index=False).agg(Person_ID=("Person_ID", "first"),
Name=("Name", list)))
print (pd.concat([df, pd.DataFrame(df.pop("Name").tolist(), columns=["Ref", "Member1", "Member2"])], axis=1))
Reference_id Person_ID Ref Member1 Member2
0 1 1 Max Kevin Sara
1 4 4 Chessi None None
2 9 5 Fernando None None
uj5u.com熱心網友回復:
你可以這樣使用pivot_table():
df1= pd.pivot_table(df, index=['Reference-ID'], values=['Person-ID', 'Name'], aggfunc=({'Person-ID':'min', 'Name':lambda x:list(x), 'Person-ID':'min'}))
df1.reset_index()[['Person-ID','Reference-ID']].join(pd.DataFrame(df1.Name.tolist()))
輸出:
| 人名 | 參考 ID | 0 | 1 | 2 |
|---|---|---|---|---|
| 1 | 1 | 最大限度 | 凱文 | 薩拉 |
| 4 | 4 | 切西 | 沒有任何 | 沒有任何 |
| 5 | 9 | 費爾南多 | 沒有任何 | 沒有任何 |
您可以像這樣重新分配列名:
df2=df1.reset_index()[['Person-ID','Reference-ID']].join(pd.DataFrame(df1.Name.tolist()))
df2.columns=list(df2.columns[0:2]) [f"Member{x 1}" for x in df2.columns[2:]]
輸出:
| 人名 | 參考 ID | 會員1 | 會員2 | 會員3 |
|---|---|---|---|---|
| 1 | 1 | 最大限度 | 凱文 | 薩拉 |
| 4 | 4 | 切西 | 沒有任何 | 沒有任何 |
| 5 | 9 | 費爾南多 | 沒有任何 | 沒有任何 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/325880.html
上一篇:如何計算組內值的平均百分比?
