2017-04-23 70 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