在合并时重塑熊猫数据框

时间:2019-09-26 12:39:41

标签: python pandas

我有一个pandas.DataFrame df,其中包含一些元数据,其中有一个IDColumn和{{1} },例如,我想与其他Value结合使用:

df

我想与下面的df_map = pd.DataFrame({"ID" : [3, 7, 17], "Column" : ["A1", "B7", "C17"], "Value" : ["ValA1", "ValB7", "ValC17"]}) 结合起来(因为缺少更好的词),其中列名与{{1}中的行条目的名称相匹配},而下方df中的行值与上方Column中的行值相匹配。

df

因此,我想将它们合并ID,以便通过将{{1} }}匹配,即df_main = pd.DataFrame({"A1" : [3, 6], "A5" : [5, 10], "B7" : [7, 14] , "C17" : [17, 34], "C19" : [19, 38] })

我基本上希望获得以下结果

df's

不确定在Value中执行此操作的最佳方法吗?

2 个答案:

答案 0 :(得分:4)

首先将DataFrame.melt转换为index到列,以避免由于左连接而丢失在DataFrame.merge中,然后用DataFrame.set_indexDataFrame.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

答案 1 :(得分:1)

使用Series.mappandas.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