2017-10-20 66 views
0

爲什麼這個代碼在下降值失去價值加入DataFrames

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 

仍然好奇與以前的方法是什麼問題,但!

+0

那是奇怪的。是's1.index' =='solddf.index'?。也許如果系列具有不同的索引集功能可能無法正常工作。這就是爲什麼它轉換爲列表時會起作用的原因。 – Dark

+0

他們沒有匹配的索引..我不明白爲什麼會導致問題,因爲我從s1.index –

+0

中取出條形碼。因爲您正試圖將系列分配給數據框,所以它們都具有相同的索引。他們將被分配到他們各自的指數。問題在於sort_values和reset_index。 – Dark

回答

1

而不是嘗試對齊兩個索引並插入新行,您應該只使用pd.merge

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

這種方式,您可以選擇的連接類型,你想這樣做,以及使用how kwarg。

我還建議閱讀Merge, join, and concatenate,因爲它涵蓋了很多有用的方法來組合數據框。