通过熊猫连接来连接多个数据框

时间:2019-02-03 14:45:12

标签: python pandas dataframe join left-join

下面有两个数据框。

df1 dataframe consists SaleDate column as the unique key column df1形状为(12,11)

下面提到的第二个数据帧

df2 dataframe consists SaleDate column as the unique key column

df2形状为(2,19)

但是每个数据帧的尺寸都不同。

有些我需要根据新的[month-year]列加入2个数据框,这些列可以从SaleDate派生,并在相应年份的整个月中添加相同的尿素价格。

预计在下面提到

df3 data-frame consist of monthly ureaprice for each raw at the data-frame 新数据框的形状(13,11)

***实际的df1包含200万条记录,而df2包含360条记录。

我试图用左连接来连接两个数据框以获得以上输出。但是,无法实现。

import pandas as pd # Import Pandas for data manipulation using dataframes

    df1['month_year']=pd.to_datetime(df1['SaleDate']).dt.to_period('M')
    df2['month_year'] = pd.to_datetime(df2['SaleDate']).dt.to_period('M')

df1 = pd.DataFrame({'Factory': ['MF0322','MF0657','MF0300','MF0790'], 
               'SaleDate': ['2013-02-07','2013-03-07','2013-06-07','2013-05-07']
               'month-year':['2013-02','2013-03','2013-06','2013-05']})

df2 = pd.DataFrame({'Price': ['398.17','425.63','398.13','363','343.33','325.13'], 
                   'Month': ['2013-01-01','2013-02-01','2013-03-01','2013-04-01','2013-05-01','2013-06-01']
                   'month-year':['2013-01','2013-02','2013-03','2013-04','2013-05','2013-06']})

最终数据框

s1 = pd.merge(df1, df2, how='left', on=['month_year'])

所有与尿素价格有关的值都是“ NaN”。

希望在这方面获得专家意见。

2 个答案:

答案 0 :(得分:0)

假设您的SaleDate列是字符串dtypes,则可以执行以下操作: df1['month_year'] = df1['SaleDate'].apply(lambda x: x[:7]) df2['month_year'] = df2['SaleDate'].apply(lambda x: x[:7])

我认为其余的应该起作用!

答案 1 :(得分:0)

我复制了您的代码,没有 month_year列:

df1 = pd.DataFrame({'Factory': ['MF0322','MF0657','MF0300','MF0790'],
    'SaleDate': ['2013-02-07','2013-03-07','2013-06-07','2013-05-07']})
df2 = pd.DataFrame({'Price': ['398.17','425.63','398.13','363','343.33','325.13'],
    'Month': ['2013-01-01','2013-02-01','2013-03-01','2013-04-01','2013-05-01',
    '2013-06-01']})

然后我在两个DataFrame中都创建了month_year列:

df1['month_year'] = pd.to_datetime(df1['SaleDate']).dt.to_period('M')
df2['month_year'] = pd.to_datetime(df2['Month']).dt.to_period('M')

并合并它们:

s1 = pd.merge(df1, df2, how='left', on=['month_year'])

执行print(s1)后,我得到了:

  Factory    SaleDate month_year   Price       Month
0  MF0322  2013-02-07    2013-02  425.63  2013-02-01
1  MF0657  2013-03-07    2013-03  398.13  2013-03-01
2  MF0300  2013-06-07    2013-06  325.13  2013-06-01
3  MF0790  2013-05-07    2013-05  343.33  2013-05-01

如您所见,Price列是正确的,等于Price 相应的月份(根据SaleDate)。

所以通常您的代码还可以。

检查其他错误来源。例如。在您的代码段中:

  • 您首先在每个DataFrame中设置month_year
  • 然后再次创建两个DataFrame,破坏先前的内容。

复制我的代码(仅此而已),并确认它给出的结果相同。 也许您的问题根源在其他地方?

请注意,例如您的df2具有Month列,而不是SaleDate列。 也许这是根本原因?