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-08
在 df2
中不存在此名称):
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 :尝试合并具有相同列名的数据框的主要内容,如果未能解决你的问题,请参考以下文章