我有一个pandas.DataFrame
(df
),其中包含一些元数据,其中有一个ID
,Column
和{{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
中执行此操作的最佳方法吗?
答案 0 :(得分:4)
首先将DataFrame.melt
转换为index
到列,以避免由于左连接而丢失在DataFrame.merge
中,然后用DataFrame.set_index
用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
答案 1 :(得分:1)
使用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