丢失值加入DataFrames

时间:2017-10-20 15:12:39

标签: python pandas dataframe

我无法理解为什么这段代码会丢弃值

solddf[['Name', 'Barcode', 'SalesRank', 'SoldPrices', 'SoldDates', 'SoldIds']].head()
Out[3]: 
                                                    Name       Barcode  \
62693  Near Dark [DVD] [1988] [Region 1] [US Import] ...  1.313124e+10   
94823                 Battlefield 2 Modern Combat / Game  1.463315e+10   
24965               Star Wars: The Force Unleashed (PS3)  2.327201e+10   
24964               Star Wars: The Force Unleashed (PS3)  2.327201e+10   
24963               Star Wars: The Force Unleashed (PS3)  2.327201e+10   

      SalesRank  SoldPrices           SoldDates       SoldIds  
62693                 14.04 2017-08-05 07:28:56  162558627930  
94823                  1.49 2017-09-06 04:48:42  132301267483  
24965                  4.29 2017-08-23 18:44:42  302424166550  
24964                  5.27 2017-09-08 19:55:02  132317908530  
24963                  5.56 2017-09-15 08:23:24  132322978130  

这是我的数据框。它将我从eBay API中提取的每笔销售作为新行存储。

我的目标是寻找每周销售额与亚马逊销售排名之间的相关性。

solddf['Week'] = solddf['SoldDates'].apply(lambda x: x.week)                      
weeklysales = solddf.groupby(['Barcode', 'Week']).size().unstack()
weeklysales = weeklysales.fillna(0)
weeklysales['Mean'] = weeklysales.mean(axis=1)

weeklysales.head()
Out[5]: 
Week           29   30   31   32   33   34   35   36   37   38   39   40   41  \
Barcode                                                                         
1.313124e+10  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   
1.463315e+10  0.0  0.0  0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0   
2.327201e+10  0.0  0.0  0.0  0.0  0.0  1.0  0.0  1.0  2.0  2.0  0.0  2.0  1.0   
2.327201e+10  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0   
2.327201e+10  0.0  0.0  3.0  2.0  2.0  2.0  1.0  1.0  5.0  0.0  2.0  2.0  1.0   

Week           42      Mean  
Barcode                      
1.313124e+10  0.0  0.071429  
1.463315e+10  0.0  0.071429  
2.327201e+10  0.0  0.642857  
2.327201e+10  0.0  0.142857  
2.327201e+10  0.0  1.500000  

所以,我已经计算出每个项目(或条形码)的平均每周销售额

然后我想取平均值并将它们插回到我开始使用的solddf数据框中。

s1 = pd.Series(weeklysales.Mean, index=solddf.Barcode).reset_index()
s1 = s1.sort_values('Barcode')

s1.head()
Out[17]: 
        Barcode      Mean
0  1.313124e+10  0.071429
1  1.463315e+10  0.071429
2  2.327201e+10  0.642857
3  2.327201e+10  0.642857
4  2.327201e+10  0.642857

这看起来很好,行数正确且应该适合

solddf = solddf.sort_values('Barcode')
solddf['WeeklySales'] = s1.Mean

这种方法似乎有效,但是我遇到了一些问题,现在出现了一些np.nan值,这些值在s1之前都没有

s1.Mean.isnull().sum()
Out[13]: 0

len(s1) == len(solddf)
Out[14]: True

但是我的价值观已经过去了np.nan

solddf.WeeklySales.isnull().sum()
Out[16]: 27214

谁能告诉我为什么?

在写这篇文章时,我有一个解决方法的想法

s1list = s1.Mean.tolist()

solddf['WeeklySales'] = s1list

solddf.WeeklySales.isnull().sum()
Out[20]: 0

仍然好奇以前的方法存在什么问题!

1 个答案:

答案 0 :(得分:1)

您应该只使用pd.merge,而不是尝试对齐两个索引并插入新行。

output = pd.merge(solddf, s1, on='Barcode')

通过这种方式,您可以使用how kwarg选择您想要进行的联接类型。

我还建议阅读Merge, join, and concatenate,因为它涵盖了许多有用的方法来组合数据帧。