如何联接行数不相等的两个数据框

时间:2018-09-01 14:55:53

标签: python pandas numpy dataframe

我想加入两个数据帧infostoreInfo包含大约一百万行,并使用信息数据框的Store列中表示的ID来显示当天某商店不同日期的销售信息,共有1115个不同的商店。 store数据框包含有关该商店及其某些功能的信息,store数据框还包含商店ID列为Store。我想加入两个数据框,以便新数据框包含数据,销售以及来自store数据框的有关商店的信息的所有功能。

我尝试了.join.merge方法,但这些方法在第1115行之前都可以正常工作,但之后却给出了空值。

Info数据框

   Store  DayOfWeek  Date        Sales  Customers  Open  Promo  StateHoliday  SchoolHoliday
   -----  ---------  ----------  -----  ---------  ----  -----  ------------  -------------
0      1          5  2015-07-31   5263        555     1      1             0              1
1      2          5  2015-07-31   6064        625     1      1             0              1
2      3          5  2015-07-31   8314        821     1      1             0              1
3      4          5  2015-07-31  13995       1498     1      1             0              1
4      5          5  2015-07-31   4822        559     1      1             0              1

store数据框

   Store  StoreType  Assortment  CompetitionDistance  CompetitionOpenSinceMonth  CompetitionOpenSinceYear  Promo2  Promo2SinceWeek  Promo2SinceYear  PromoInterval  
   -----  ---------  ----------  -------------------  -------------------------  ------------------------  ------  ---------------  ---------------  ---------------
0      1  c          a                          1270                          9                      2008       0  NaN              NaN              NaN            
1      2  a          a                           570                         11                      2007       1  13               2010             Jan,Apr,Jul,Oct
2      3  a          a                         14130                         12                      2006       1  14               2011             Jan,Apr,Jul,Oct
3      4  c          c                           620                          9                      2009       0  NaN              NaN              NaN            
4      5  a          a                         29910                          4                      2015       0  NaN              NaN              NaN            

2 个答案:

答案 0 :(得分:0)

您可以使用left_joindplyr软件包中的tidyverse函数。

根据您的数据,您可以使用: joinedDf = left_join(Info, store, by = c("Store" = "Store")

请注意,我在连接的数据框中还遇到了特殊的NA值,这是我目前无法解释的事情。但是,如果您确定这些NA行无用,只需使用joinedDf = joinedDf[complete.cases(joinedDf), ]删除带有NA的行。

答案 1 :(得分:0)

您确实想执行联接,但是听起来好像您没有指定要联接的列。

样本数据:

info

   Year  Week  Store  Sales
0  2018     1      1   1011
1  2018     2      1   1021
2  2018     1      2   1012
3  2018     2      2   1022

store

   Store StoreName StoreCity
0      1    store1     city1
1      2    store2     city2

.join的默认设置是加入数据框的索引,因此

joined = info.join(store, lsuffix='_from_info')

生成一个DataFrame,其中仅前两行“匹配”(索引0和1)

   Year  Week  Store_from_info  Sales  Store StoreName StoreCity
0  2018     1                1   1011    1.0    store1     city1
1  2018     2                1   1021    2.0    store2     city2
2  2018     1                2   1012    NaN       NaN       NaN
3  2018     2                2   1022    NaN       NaN       NaN

请注意,结果的第二行(索引1)已将store1的info数据(Store_from_info为1)与store2的store数据连接在一起。那不是你想要的。

相反,您想加入每个DataFrame中的Store列。可以这样

joined = info.join(store.set_index('Store'), on='Store')

生产

   Year  Week  Store  Sales StoreName StoreCity
0  2018     1      1   1011    store1     city1
1  2018     2      1   1021    store1     city1
2  2018     1      2   1012    store2     city2
3  2018     2      2   1022    store2     city2

有关详情,请参见熊猫.join documentation