Python 3.x 合并的数据帧似乎缺少两行

Python 3.x 合并的数据帧似乎缺少两行,python-3.x,pandas,dataframe,indexing,merge,Python 3.x,Pandas,Dataframe,Indexing,Merge,我运行了以下代码: 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],

我运行了以下代码:

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) 如果merge将从HPI中获取所有值,那么为什么值80和88没有分别获取两次呢?

您将获得
85
4次,因为在
df1
df2
的联接列中重复了
HPI
。而
88
80
是唯一的,因此内部连接会为每个连接返回alo一行

显然,
内部联接
意味着,如果两个表中的联接列上都有匹配项,那么每一行都将被匹配尽可能多的次数

因此,在合并之前,需要删除重复项以获得正确的输出

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




您将获得
85
4次,因为在
df1
df2
的联接列中重复了
HPI
。而
88
80
是唯一的,因此内部连接会为每个连接返回alo一行

显然,
内部联接
意味着,如果两个表中的联接列上都有匹配项,那么每一行都将被匹配尽可能多的次数

因此,在合并之前,需要删除重复项以获得正确的输出

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




正如jezrael所写,您有6行,因为df1和df3中的
HPI=85
的值不是唯一的。与df1和df3相反,只有
HPI=80
HPI=88
的值。 如果我假设并考虑你的<代码>索引>代码>,我可以猜出你想要的是这样的:

       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')

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

正如jezrael所写的,您有6行,因为df1和df3中的
HPI=85
的值不是唯一的。与df1和df3相反,只有
HPI=80
HPI=88
的值。 如果我假设并考虑你的<代码>索引>代码>,我可以猜出你想要的是这样的:

       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')

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

Downvoter,如果我的答案有问题,请告诉我,以便我可以更正。谢谢,好的。。但是88和80在两个数据帧中都存在。那么为什么不重复呢???@DibakarBose-但值并不复杂,存在差异。@DibakarBose-我添加了更多样本,请检查是否更清晰。Downvoter,如果我的答案有问题,请让我知道,以便我可以更正。谢谢,好的。。但是88和80在两个数据帧中都存在。那么为什么不重复呢???@DibakarBose-但数值并不复杂,存在差异。@DibakarBose-我添加了更多的样本,请检查它是否更清晰。我强烈建议您仔细阅读可能的副本。您的问题更多的是关于一般性地理解合并,那里的教程中有一些示例演示了您可以期望的内容。@jpp::当然。。。我会这么做的。。。谢谢:)我强烈建议你通读一下。您的问题更多的是关于一般性地理解合并,那里的教程中有一些示例演示了您可以期望的内容。@jpp::当然。。。我会这么做的。。。谢谢:)是的。。。这就是我想要的输出…:)对这就是我想要的输出…:)