在 Python 3.x 中将基于特定列的列和值的两个 DataFrame 与 Pandas 合并

Posted

技术标签:

【中文标题】在 Python 3.x 中将基于特定列的列和值的两个 DataFrame 与 Pandas 合并【英文标题】:Merge two DataFrames based on columns and values of a specific column with Pandas in Python 3.x 【发布时间】:2019-04-12 09:13:18 【问题描述】:

您好,我有一个问题,我无法实施解决方案。 我有以下两个数据框:

>>> df1
A  B   date
1  1  01-2016
2  1  02-2017
1  2  03-2017
2  2  04-2020

>>> df2
A  B  01-2016  02-2017  03-2017  04.2020
1  1    0.10    0.22     0.55     0.77
2  1    0.20    0.12     0.99     0.125
1  2    0.13    0.15     0.15     0.245
2  2    0.33    0.1      0.888    0.64

我想要的是关注 DataFrame:

>>> df3
A  B   date      value
1  1  01-2016    0.10
2  1  02-2017    0.12
1  2  03-2017    0.15
2  2  04-2020    0.64

我已经尝试过:

        summarize_dates = self.summarize_specific_column(data=df1, column='date')

        for date in summarize_dates:
            left_on = np.append(left_on, date)
            right_on = np.append(right_on, merge_columns.upper())
            result = pd.merge(left=df2, right=df1,
                              left_on=left_on, right_on=right_on,
                              how='right')
            print(result)

这不起作用。你能帮助我并建议一个更舒适的实施吗?非常感谢您!

【问题讨论】:

最简单的方法是融化 df2,然后在 df1 上进行左连接。 感谢您的回答。但是你说的“融化框架”是什么意思?编辑:已经回答。 :) 【参考方案1】:

你可以融化 df2,然后使用默认的 'inner' 合并进行合并

df3 = df1.merge(df2.melt(id_vars = ['A', 'B'], var_name='date'))

    A   B   date    value
0   1   1   01-2016 0.10
1   2   1   02-2017 0.12
2   1   2   03-2017 0.15
3   2   2   04-2020 0.64

【讨论】:

谢谢你,我会试试看! 工作正常!非常感谢! @MichaelGann,别忘了accept你认为最合适的答案。【参考方案2】:

使用lookup

df1['value']=df2.set_index(['A','B']).lookup(df1.set_index(['A','B']).index,df1.date)
df1
Out[228]: 
   A  B     date  value
0  1  1  01-2016   0.10
1  2  1  02-2017   0.12
2  1  2  03-2017   0.15
3  2  2  04-2020   0.64

【讨论】:

工作正常!非常感谢!

以上是关于在 Python 3.x 中将基于特定列的列和值的两个 DataFrame 与 Pandas 合并的主要内容,如果未能解决你的问题,请参考以下文章

删除熊猫数据框中包含特定值的列和行[重复]

Oracle:查找只有空值的列

如何在python中将特定范围的列扁平化为一个?

MySQL更新列的序列号按具有相同值的字段分组

SQL - 对表的列和的操作

基于另一列的每个值的列值总和,然后除以总数