2017-04-23 73 views
1

從CSV以下萃取讀入大熊貓作爲pd熊貓系列從數據幀列時索引列包含重複

return pd.Series((wb['impressions'].values * 1.0)/(wb['ad_requests'].values * 1.0), index=wb['\xef\xbb\xbf"ad_tag_name"']).to_dict() 

不再有效,因爲現在,如下面的圖像,

  1. 多個在列A中的相同名稱的條目he.com_300x2(3 的he.com_300x250_bottomloopmobile,4 50_bottomloopmobile爲例)
  2. C列將始終爲空,對於除第一項以外每個 的唯一值。

enter image description here

我需要每列A的「鑰匙」現在總和這些多個值,以及C柱也這樣做,然後插入這些回除法計算和系列創作。

groupby()試驗把隔離前者表現好(重複鍵被刪除,這就是我想要的):

In [36]: wb.groupby('\xef\xbb\xbf"ad_tag_name"').sum()['impressions'] 
Out[36]: 
"ad_tag_name" 
he.com_300x250_bottomloopmobile        26752 
he.com_300x250_bottomslidemobile        31217 

然而,當我加入早在index=wb['\xef\xbb\xbf"ad_tag_name"']嘗試重建完整配方,熊貓不再下降的重複:

In [37]: pd.Series(wb.groupby('\xef\xbb\xbf"ad_tag_name"').sum()['impressions'], index=wb['\xef\xbb\xbf"ad_tag_name"']) 
Out[37]: 
"ad_tag_name" 
he.com_300x250_bottomloopmobile   26752 
he.com_300x250_bottomloopmobile   26752 
he.com_300x250_bottomloopmobile   26752 
he.com_300x250_bottomslidemobile   31217 
he.com_300x250_bottomslidemobile   31217 
he.com_300x250_bottomslidemobile   31217 
he.com_300x250_bottomslidemobile   31217 

假設公式可以原封不動的groupby()組成部分,我們如何告訴一連串的創作認識到索引列的重複鍵?

回答

1

看來你需要分配輸出到wb - groupbysum彙總所有數值列,因此沒有重複,最後加as_index=FalseDataFrame輸出:

wb = wb.groupby("ad_tag_name", as_index=False).sum() 
#alternative solution 
#wb = wb.groupby("ad_tag_name").sum().reset_index() 

樣品:

wb = pd.DataFrame({'ad_tag_name':['he.com_300x250_bottomloopmobile'] * 3 + 
           ['he.he.com_300x250_bottomslidemobile'] * 4, 
        'impressions':[309, 3029,23414,1465,5725,2918,11109], 
        'ad_requests':[37849,np.nan,np.nan, 42300,np.nan, np.nan, np.nan]}) 

#print (wb)  

wb = wb.groupby('ad_tag_name', as_index=False).sum() 
print (wb) 
          ad_tag_name ad_requests impressions 
0  he.com_300x250_bottomloopmobile  37849.0  26752 
1 he.he.com_300x250_bottomslidemobile  42300.0  21217 

a = pd.Series((wb['impressions'].values * 1.0)/(wb['ad_requests'].values * 1.0), 
      index=wb['ad_tag_name']).to_dict() 

print (a) 
{'he.he.com_300x250_bottomslidemobile': 0.50158392434988175, 
'he.com_300x250_bottomloopmobile': 0.70680863431002139} 

也爲刪除\xef\xbb\xbf添加encoding='utf-8-sig'read_csv或升級熊貓到最新版本,因爲這個bug是closed and solved

+0

謝謝,但你在最後的'df'中有重複的值。 *展示次數*要加總,**每個唯一的廣告代碼**。列* ad_tag_name *中的每個相同的值都指向同一個實體。所以最後的df(在你的例子中)應該只有3行,每個a,b,c。 – Pyderman

+0

請檢查編輯答案。 – jezrael

+0

有趣的方法,在應用計算之前聚合並求和_all_列。優雅。謝謝。 – Pyderman