pd.merge :尝试合并具有相同列名的数据框

Posted

技术标签:

【中文标题】pd.merge :尝试合并具有相同列名的数据框【英文标题】:pd.merge : trying to merge Dataframes with same columns names 【发布时间】:2020-04-13 01:44:41 【问题描述】:

我知道这是一个简单的问题,但我被困了很长一段时间。 我有两个DataFrame,它们有一千个操作系统行,但这里有一个示例:

df1 = 

Name    Value    Date
x        0.04    2014-01-02
x        0.03    2014-01-03
x        0.02    2014-01_05
x        0.02    2014-01-07
(...)    (...)      (...)
y        0.002   2014-01-01
y        0.001   2014-01-02
y        0.003   2014-01-03
y        0.004   2014-01-07
(...)     (...)     (...)
z        0.003   2014-01-02
z        0.003   2014-01-05
z        0.004   2014-01-07
(...)     (...)      (...)

还有一个Dataframe

df2 = 

  Name    Value    Date
    x        0.04    2015-01-02
    x        0.03    2015-01-03
    x        0.02    2015-01_05
    x        0.02    2015-01-07
    (...)    (...)      (...)
    y        0.002   2015-01-01
    y        0.001   2015-01-02
    y        0.003   2015-01-03
    y        0.004   2015-01-07
    (...)     (...)     (...)
    z        0.003   2015-01-02
    z        0.003   2015-01-05
    z        0.004   2015-01-07
    (...)     (...)      (...)

我想要什么:

df3=
   Name    Value    Date
    x        0.04    2014-01-02
    x        0.03    2014-01-03
    x        0.02    2014-01_05
    x        0.02    2014-01-07
    x        0.04    2015-01-02
    x        0.03    2015-01-03
    x        0.02    2015-01_05
    x        0.02    2015-01-07
    (...)    (...)      (...)
    y        0.002   2014-01-01
    y        0.001   2014-01-02
    y        0.003   2014-01-03
    y        0.004   2014-01-07
    y        0.002   2015-01-01
    y        0.001   2015-01-02
    y        0.003   2015-01-03
    y        0.004   2015-01-07
    (...)     (...)     (...)
    z        0.003   2014-01-02
    z        0.003   2014-01-05
    z        0.004   2014-01-07
    z        0.003   2015-01-02
    z        0.003   2015-01-05
    z        0.004   2015-01-07
    (...)     (...)      (...)

1) 当我合并时,如果 "name" 不存在于 2014 年的数据中,我希望它不存在于我的 df3 中,并且与我的 2015 年的数据相同。

换句话说,我只想要在我的Dataframes 中都具有价值的"Name"

我尝试了什么:

a= df1.merge(df2,how="inner") 还有

frames= [df1,df2]
df3= pd.concat([frames],axis=1)

但是我得到的输出:

df3 = 

Value_x     Date_y    Name    Value_y    Date_y 
  0.03    2014-01-02    x        0.04    2015-01-02
  0.02    2014-01-05    x        0.03    2015-01-03
  0.03    2014-01-06    x        0.02    2015-01_05
  0.03    2014-01-07    x        0.02    2015-01-07
  (...)     (...)     (...)      (...)     (...)    
   0.02   2014-01-03    y        0.002   2015-01-01
   0.01   2014-01-07    y        0.001   2015-01-02
   0.02   2014-01-06    y        0.003   2015-01-03
   00.2   2014-01-07    y        0.004   2015-01-07
  (...)     (...)     (...)      (...)     (...)
   0.03   2014-01-02   z        0.003   2015-01-02
   0.01   2014-01-04   z        0.003   2015-01-05
   0.03   2014-01-05   z        0.004   2015-01-07
  (...)      (...)     (...)     (...)   (...)

【问题讨论】:

你应该在 pd.concat 中使用 axis = 0 吗? 【参考方案1】:

你可以试试

df3 = pd.merge(df1, df2, left_on='Value', right_on='Value')

【讨论】:

【参考方案2】:

使用pd.append:你可以这样做

#...

df = df1.append(df2, ignore_index=True)

# or more dfs list
df = df1.append([df2, df3], ignore_index=True)

有关更多信息,请参阅文档https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.append.html

【讨论】:

【参考方案3】:

如果我理解正确,您希望匹配 2014 年和 2015 年的 days。如果 2014 年或 2015 年缺少某一天,则不应出现在结果框架中。

注意,在此示例中,我将 2014-01-08 日期作为名称 z 添加到 df1 - 它不会出现在最终数据框中,因为 2015-01-08df2 中不存在此名称):

import pandas as pd

name_1 = ['x', 'x', 'x', 'x', 'y', 'y', 'y', 'y', 'z', 'z', 'z', 'z']
value_1 = [0.04, 0.03, 0.02, 0.02, 0.002, 0.001, 0.003, 0.004, 0.003, 0.003, 0.004, 0.009]
date_1 = ['2014-01-02', '2014-01-03', '2014-01-05', '2014-01-07', '2014-01-01', '2014-01-02', '2014-01-03', '2014-01-07', '2014-01-02', '2014-01-05', '2014-01-07', '2014-01-08']

name_2 = ['x', 'x', 'x', 'x', 'y', 'y', 'y', 'y', 'z', 'z', 'z']
value_2 = [0.04, 0.03, 0.02, 0.02, 0.002, 0.001, 0.003, 0.004, 0.003, 0.003, 0.004]
date_2 = ['2015-01-02', '2015-01-03', '2015-01-05', '2015-01-07', '2015-01-01', '2015-01-02', '2015-01-03', '2015-01-07', '2015-01-02', '2015-01-05', '2015-01-07']

df1 = pd.DataFrame('Name':name_1, 'Value':value_1, 'Date': date_1)
df2 = pd.DataFrame('Name':name_2, 'Value':value_2, 'Date': date_2)

df1['days'] = df1['Date'].str.split(r'\d4-(\d+-\d+)', expand=True)[1]
df2['days'] = df2['Date'].str.split(r'\d4-(\d+-\d+)', expand=True)[1]

df = pd.merge( df1,  df2, on=['Name', 'days'] )

df = df1[ df1.set_index( ['Name', 'Date'] ).index.isin( df.set_index( ['Name', 'Date_x']).index ) ].append(
        df2[ df2.set_index( ['Name', 'Date'] ).index.isin( df.set_index( ['Name', 'Date_y']).index ) ]
    ).sort_values(['Name', 'Date']).reset_index(drop=True)
del df['days']

print(df)

打印:

   Name  Value        Date
0     x  0.040  2014-01-02
1     x  0.030  2014-01-03
2     x  0.020  2014-01-05
3     x  0.020  2014-01-07
4     x  0.040  2015-01-02
5     x  0.030  2015-01-03
6     x  0.020  2015-01-05
7     x  0.020  2015-01-07
8     y  0.002  2014-01-01
9     y  0.001  2014-01-02
10    y  0.003  2014-01-03
11    y  0.004  2014-01-07
12    y  0.002  2015-01-01
13    y  0.001  2015-01-02
14    y  0.003  2015-01-03
15    y  0.004  2015-01-07
16    z  0.003  2014-01-02
17    z  0.003  2014-01-05
18    z  0.004  2014-01-07
19    z  0.003  2015-01-02
20    z  0.003  2015-01-05
21    z  0.004  2015-01-07

【讨论】:

以上是关于pd.merge :尝试合并具有相同列名的数据框的主要内容,如果未能解决你的问题,请参考以下文章

17、pandas的merge合并函数

使用 pd.merge() 合并两个以上的数据帧

有没有办法在行和列索引上合并熊猫数据框?

合并具有不同列名但定义相同的多个CSV

Python-dataframe合并(merge函数)

如何合并具有相同列名的多个数据框?