合并中从宽到长

2024年 2月 10日 48.3k 0

合并中从宽到长

问题内容

您好,我正在尝试通过以下方式合并两个数据集:

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

登录后复制

以上就是合并中从宽到长的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论