为了账号安全,请及时绑定邮箱和手机立即绑定

在进行合并时重塑熊猫数据框

在进行合并时重塑熊猫数据框

慕娘9325324 2022-06-07 18:46:29
我有一个pandas.DataFrame ( df)和一些元数据,其中有一个ID,Column并且Value我想与另一个结合df ,例如:df_map = pd.DataFrame({"ID" : [3, 7, 17], "Column" : ["A1", "B7", "C17"],                        "Value" : ["ValA1", "ValB7", "ValC17"]})我想将 上面(为了更好的词)与下面结合起来df,其中列名与上面的行条目匹配,Column下面df的行值与上面的行值匹配ID。df_main = pd.DataFrame({"A1" : [3, 6], "A5" : [5, 10], "B7" : [7, 14] ,                         "C17" : [17, 34], "C19" : [19, 38] })因此,我想将这些合并到这样一种方式,即我通过将它们添加为匹配的附加维度来df's根据列重塑它,即ValueID'sdf_result = combine(df_map, df_main)我基本上期望结果如下df_result = pd.DataFrame({"A1" : [3, 6], "A5" : [5, 10], "B7" : [7, 14] ,                          "C17" : [17, 34], "C19" : [19, 38], "Value A1" : ["ValA1", None],                         "Value B7" : ["ValB7", None], "Value C17" : ["ValC17", None ]})Out[30]:   A1  A5  B7  C17  C19 Value A1 Value B7 Value C170   3   5   7   17   19    ValA1    ValB7    ValC171   6  10  14   34   38     None     None      None不确定执行此操作的最佳方法pandas?
查看完整描述

2 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

首先DataFrame.meltwith 转换index为 column 以避免在DataFrame.merge左连接中丢失,然后通过DataFrame.set_indexwith重新整形DataFrame.unstack,仅删除缺少的列DataFrame.dropna,最后MultiIndex用展平map:


df = (df_main.reset_index()

             .melt('index',var_name='Column', value_name='ID')

             .merge(df_map, how='left')

             .set_index(['index', 'Column'])

             .unstack()

             .rename_axis(None)

             .dropna(how='all', axis=1))

df.columns = df.columns.map('_'.join)

print (df)

   ID_A1  ID_A5  ID_B7  ID_C17  ID_C19 Value_A1 Value_B7 Value_C17

0      3      5      7      17      19    ValA1    ValB7    ValC17

1      6     10     14      34      38      NaN      NaN       NaN


查看完整回答
反对 回复 2022-06-07
?
holdtom

TA贡献1805条经验 获得超10个赞

Series.map和pandas.concat的替代解决方案:


df2=pd.concat([df_main.T[key].map(df_map.set_index('ID')['Value']) for key in df_main.index.tolist()],axis=1).T.add_prefix('Value_')

df_main=pd.concat([df_main,df2],axis=1)

df_main.dropna(how='all',axis=1,inplace=True)

print(df_main)


   A3  A5  B7  C17  C19 Value_A3 Value_B7 Value_C17

0   3   5   7   17   19    ValA1    ValB7    ValC17

1   6  10  14   34   38      NaN      NaN       NaN


查看完整回答
反对 回复 2022-06-07
  • 2 回答
  • 0 关注
  • 116 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信