python - 在进行合并时重塑熊猫数据框
问题描述
我有一个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
基于列重塑它,即Value
ID's
df_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 C17
0 3 5 7 17 19 ValA1 ValB7 ValC17
1 6 10 14 34 38 None None None
不确定执行此操作的最佳方法pandas
?
解决方案
首先DataFrame.melt
with 转换index
为 column 以避免在DataFrame.merge
左连接中丢失,然后通过DataFrame.set_index
with重新整形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
推荐阅读
- javascript - 如何通过识别Javascript中的前四个字母来匹配子字符串?
- javascript - IntersactionObserver() 只观察一行的第一个元素而不是所有
- python - 无法让 python subprocess.Popen() 在后台启动另一个 python 脚本
- r - R:如何根据多个其他列在一列中查找不同的值
- node.js - Node.js:有没有办法模拟 prometheus pushgateway 服务器?
- pandas - 在带有条件的日期中添加新的列基
- firebase - Flutter:使用共享首选项从 Firestore 中保存用户 ID,并将值检索到类中
- javafx - javafx中如何区分单击或双击表格行
- javascript - 试图检索 discord.js 服务器所有者名称
- android - 这个 Android 电子邮件地址选择器是什么?这是本机小部件吗?