合并的数据框似乎缺少两行
Posted
技术标签:
【中文标题】合并的数据框似乎缺少两行【英文标题】:Merged dataframe seems missing two rows 【发布时间】:2018-08-01 22:02:22 【问题描述】:我已经运行了以下代码:
df1 = pd.DataFrame('HPI':[80,85,88,85],
'Int_rate':[2, 3, 2, 2],
'US_GDP_Thousands':[50, 55, 65, 55],
index = [2001, 2002, 2003, 2004])
df3 = pd.DataFrame('HPI':[80,85,88,85],
'Unemployment':[7, 8, 9, 6],
'Low_tier_HPI':[50, 52, 50, 53],
index = [2001, 2002, 2003, 2004])
print(pd.merge(df1,df3, on='HPI'))
我得到的输出是:
HPI Int_rate US_GDP_Thousands Low_tier_HPI Unemployment
0 80 2 50 50 7
1 85 3 55 52 8
2 85 3 55 53 6
3 85 2 55 52 8
4 85 2 55 53 6
5 88 2 65 50 9
我的问题是
1) 为什么我有这么大的数据框。 HPI 只有 4 个值,但在输出中生成了 6 行。
2) 如果合并将从 HPI 中获取所有值,那么为什么值 80 和 88 没有被分别获取两次?
【问题讨论】:
Pandas Left Outer Join results in table larger than left table的可能重复 我强烈建议您通读pandas documentation on merges。您的问题更多是关于一般理解合并,并且那里的教程有一些示例可以展示您可以期待的内容。 @jpp :: 当然可以...我会这样做...谢谢:) 【参考方案1】:您获得了 4 次 85
,因为在 df1
和 df2
的连接列 HPI
中重复。并且88
和80
是唯一的,因此内部连接每个返回一行。
显然,inner join
的意思是,如果两个表中的连接列都存在匹配项,则每一行都将匹配最大可能的次数。
所以在合并之前需要删除重复项才能正确输出。
df1 = df1.drop_duplicates('HPI')
df3 = df3.drop_duplicates('HPI')
HPI
列和输出中具有重复值的样本:
#2dupes 85
df1 = pd.DataFrame('HPI':[80,85,88,85],
'Int_rate':[2, 3, 2, 2],
'US_GDP_Thousands':[50, 55, 65, 55],
index = [2001, 2002, 2003, 2004])
#2dupes 85
df3 = pd.DataFrame('HPI':[80,85,88,85],
'Unemployment':[7, 8, 9, 6],
'Low_tier_HPI':[50, 52, 50, 53],
index = [2001, 2002, 2003, 2004])
#4dupes 85 - 2x2, value 85 in both columns
print(pd.merge(df1,df3, on='HPI'))
HPI Int_rate US_GDP_Thousands Low_tier_HPI Unemployment
0 80 2 50 50 7
1 85 3 55 52 8
2 85 3 55 53 6
3 85 2 55 52 8
4 85 2 55 53 6
5 88 2 65 50 9
#2 dupes 80, 2dupes 85
df1 = pd.DataFrame('HPI':[80,85,80,85],
'Int_rate':[2, 3, 2, 2],
'US_GDP_Thousands':[50, 55, 65, 55],
index = [2001, 2002, 2003, 2004])
#2dupes 85 , unique 80
df3 = pd.DataFrame('HPI':[80,85,88,85],
'Unemployment':[7, 8, 9, 6],
'Low_tier_HPI':[50, 52, 50, 53],
index = [2001, 2002, 2003, 2004])
#4dupes 80, 2x1, 4dupes 85 - 2x2, values 80,85 in both columns
print(pd.merge(df1,df3, on='HPI'))
HPI Int_rate US_GDP_Thousands Low_tier_HPI Unemployment
0 80 2 50 50 7
1 80 2 65 50 7
2 85 3 55 52 8
3 85 3 55 53 6
4 85 2 55 52 8
5 85 2 55 53 6
#2dupes 80
df1 = pd.DataFrame('HPI':[80,80,82,83],
'Int_rate':[2, 3, 2, 2],
'US_GDP_Thousands':[50, 55, 65, 55],
index = [2001, 2002, 2003, 2004])
#2 dupes 85
df3 = pd.DataFrame('HPI':[80,85,88,85],
'Unemployment':[7, 8, 9, 6],
'Low_tier_HPI':[50, 52, 50, 53],
index = [2001, 2002, 2003, 2004])
#2dupes 80, 2x1value 80 in both columns
print(pd.merge(df1,df3, on='HPI'))
HPI Int_rate US_GDP_Thousands Low_tier_HPI Unemployment
0 80 2 50 50 7
1 80 3 55 50 7
#4dupes 80
df1 = pd.DataFrame('HPI':[80,80,80,80],
'Int_rate':[2, 3, 2, 2],
'US_GDP_Thousands':[50, 55, 65, 55],
index = [2001, 2002, 2003, 2004])
#3 dupes 80
df3 = pd.DataFrame('HPI':[80,80,80,85],
'Unemployment':[7, 8, 9, 6],
'Low_tier_HPI':[50, 52, 50, 53],
index = [2001, 2002, 2003, 2004])
#12dupes 80, 4x3, value 80 in both columns
print(pd.merge(df1,df3, on='HPI'))
HPI Int_rate US_GDP_Thousands Low_tier_HPI Unemployment
0 80 2 50 50 7
1 80 2 50 52 8
2 80 2 50 50 9
3 80 3 55 50 7
4 80 3 55 52 8
5 80 3 55 50 9
6 80 2 65 50 7
7 80 2 65 52 8
8 80 2 65 50 9
9 80 2 55 50 7
10 80 2 55 52 8
11 80 2 55 50 9
【讨论】:
投反对票,如果我的回答有问题,请告诉我,以便我更正。谢谢。 好的.. 但是两个数据帧中都存在 88 和 80。那为什么不重复呢?? @DibakarBose - 但是值不是重复的,是有区别的。 @DibakarBose - 我添加了更多样本,如果更清楚,请检查它。【参考方案2】:正如 jezrael 所写,您有 6 行,因为 df1 和 df3 中 HPI=85
的值不是唯一的。相反,在 df1 和 df3 上,您只有 HPI=80
和 HPI=88
的值。
如果我做一个假设并考虑你的index
,我猜你想要的是这样的:
HPI Int_rate US_GDP_Thousands Low_tier_HPI Unemployment
index
2001 80 2 50 50 7
2002 85 3 55 52 8
2003 88 2 65 50 9
2004 85 2 55 53 6
如果你想要这样的东西,那么你可以这样做:
pd.merge(df1, df3, left_index=True, right_index=True, on='HPI')
但我只是做一个假设,所以我不知道这是否是你想要的输出。
【讨论】:
是的...这就是我正在寻找的输出... :)以上是关于合并的数据框似乎缺少两行的主要内容,如果未能解决你的问题,请参考以下文章