合并的数据框似乎缺少两行

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,因为在 df1df2 的连接列 HPI 中重复。并且8880 是唯一的,因此内部连接每个返回一行。

显然,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=80HPI=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')

但我只是做一个假设,所以我不知道这是否是你想要的输出。

【讨论】:

是的...这就是我正在寻找的输出... :)

以上是关于合并的数据框似乎缺少两行的主要内容,如果未能解决你的问题,请参考以下文章

连接/加入/合并两个缺少一列的数据框

合并其中一列或另一列中缺少数据的数据框

无法将新数据合并到列表的每个数据框元素

使用Python / Pandas将两行数据合并为一行

加入字符串时,Pandas 合并结果缺少行

python pandas将两行或多行文本合并为一行