首頁 > 後端開發 > Python教學 > 合併中從寬到長

合併中從寬到長

WBOY
發布: 2024-02-09 23:50:04
轉載
712 人瀏覽過

合併中從寬到長

問題內容

您好,我正在嘗試透過以下方式合併兩個資料集:

df1=pd.dataframe({'company name':['a','b','c'],
               'analyst 1 name':['tom','mike',np.nan],
               'analyst 2 name':[np.nan,'alice',np.nan],
               'analyst 3 name':['jane','steve','alex']})

df2=pd.dataframe({'company name':['a','b','c'],
               'score 1':[3,5,np.nan],
               'score 2':[np.nan,1,np.nan],
               'score 3':[6,np.nan,11]})

df_desire=pd.dataframe({'company name':['a','a','b','b','b','c'],
               'analyst':['tom','jane','mike','alice','steve','alex'],
               'score':[3,6,5,1,np.nan,11]})
登入後複製

基本上,df1 包含分析家姓名,df2 包含分析師分配的分數。我正在嘗試將兩個合併到 df_desire 中。讀取兩張表的方法是:對於a公司,由兩個人覆蓋,分別是tom和jane,他們分別分配3和6。注意到儘管 steve 涵蓋了 b 公司,但出於魯棒性目的,我故意將分數指定為 na。

我所做的是:

pd.concat([df1.melt(id_vars='company name',value_vars=['analyst 1 name','analyst 2 name','analyst 3 name']),\
           df2.melt(id_vars='company name',value_vars=['score 1','score 2','score 3'])],axis=1)
登入後複製

我正在尋找更優雅的解決方案。


正確答案


嘗試:

x = (
    df1.set_index("company name")
    .stack(dropna=false)
    .reset_index(name="name")
    .drop(columns="company name")
)
y = df2.set_index("company name").stack(dropna=false).reset_index(name="score")

print(
    pd.concat([x, y], axis=1)[["company name", "name", "score"]]
    .dropna(subset=["name", "score"], how="all")
    .reset_index(drop=true)
)
登入後複製

列印:

  company name   name  score
0            A    Tom    3.0
1            A   Jane    6.0
2            B   Mike    5.0
3            B  Alice    1.0
4            B  Steve    NaN
5            C   Alex   11.0
登入後複製

以上是合併中從寬到長的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板