合并中从宽到长
问题内容
您好,我正在尝试通过以下方式合并两个数据集:
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 score0 A Tom 3.01 A Jane 6.02 B Mike 5.03 B Alice 1.04 B Steve NaN5 C Alex 11.0