考慮這個例子:
import polars as pl
df = pl.DataFrame({
'ID': ['0', '1', '2', '3', '4', '5','6', '7', '8', '9', '10'],
'Name' : ['A','','','','B','','C','','','D', ''],
'Element' : ['', '4', '4', '0', '', '4', '', '0', '9', '', '6']
})
“名稱”鏈接到“ID”。此 ID 用作“元素”列中的值。如何將正確的“名稱”映射到元素?我還想按“名稱”(“名稱串列”)對元素進行分組,對它們進行計數并按計數值(“E_count”)進行排序。
結果 df 將是:
Name_list Element E_count
-------------------------
'B' '4' 3
'A' '0' 2
'C' '6' 1
'D' '9' 1
非常感謝您的反饋;甚至是熊貓解決方案。
uj5u.com熱心網友回復:
這是一個 Polars 解決方案。我們將使用 ajoin來鏈接ID和Element列(經過一些過濾和匯總)。
import polars as pl
(
df.select(["Name", "ID"])
.filter(pl.col("Name") != "")
.join(
df.groupby("Element").agg(pl.count().alias("E_count")),
left_on="ID",
right_on="Element",
how="left",
)
.sort('E_count', reverse=True)
.rename({"Name":"Name_list", "ID":"Element"})
)
注意:這與您的答案中列出的解決方案不同。名稱D與 ID 相關聯9(不是 10)。
shape: (4, 3)
┌───────────┬─────────┬─────────┐
│ Name_list ┆ Element ┆ E_count │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ u32 │
╞═══════════╪═════════╪═════════╡
│ B ┆ 4 ┆ 3 │
├???????????┼?????????┼?????????┤
│ A ┆ 0 ┆ 2 │
├???????????┼?????????┼?????????┤
│ C ┆ 6 ┆ 1 │
├???????????┼?????????┼?????????┤
│ D ┆ 9 ┆ 1 │
└───────────┴─────────┴─────────┘
您還可以使用polars.Series.value_counts方法,該方法看起來更簡潔:
import polars as pl
(
df.select(["Name", "ID"])
.filter(pl.col("Name") != "")
.join(
df.get_column("Element").value_counts(),
left_on="ID",
right_on="Element",
how="left",
)
.sort("counts", reverse=True)
.rename({"Name": "Name_list", "ID": "Element", "counts": "E_count"})
)
uj5u.com熱心網友回復:
如果我正確理解了您的問題,那么您可以使用 pandas 并執行以下操作:
countdf = pd.merge(df,df[['ID','Name']],left_on='Element',right_on='ID',how='inner')
countdf = pd.DataFrame(countdf.groupby('Name_y')['Element'].count())
result = pd.merge(countdf,df[['Name','ID']],left_on='Name_y',right_on='Name',how='left')
result[['Name','ID','Element']]
uj5u.com熱心網友回復:
使用 pandas 我們可以使用 map 來映射值并使用 where 條件來防止將 name 設為 null。最后,它是一個groupby
df['Name'] = df['Name'].where(cond=df['Element']=="",
other=df[df['Element']!=""]['Element'].map(lambda x: df[df['ID'] == x]['Name'].tolist()[0]),
axis=0)
df[df['Element'] != ""].groupby(['Name','Element']).count().reset_index()
Name Element ID
0 A 0 2
1 B 4 3
2 C 6 1
3 D 9 1
uj5u.com熱心網友回復:
試試這個,你不需要 groupby 也不需要 joins,只需要 map 和 value_counts:
df.drop('Element', axis=1)\
.query('Name != "" ')\
.assign(E_count = df['ID'].map(df['Element'].value_counts()))
輸出:
ID Name E_count
0 0 A 2.0
4 4 B 3.0
6 6 C 1.0
9 9 D 1.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/474508.html
上一篇:我正在嘗試合并兩個資料框
下一篇:在Pandas中合并列
