下面有两个数据框。
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”。
希望在这方面获得专家意见。
答案 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
)。
所以通常您的代码还可以。
检查其他错误来源。例如。在您的代码段中:
month_year
,复制我的代码(仅此而已),并确认它给出的结果相同。 也许您的问题根源在其他地方?
请注意,例如您的df2
具有Month
列,而不是SaleDate
列。
也许这是根本原因?