当索引列包含重复项时,DataFrame列中的Pandas系列

时间:2017-04-23 13:54:24

标签: python python-2.7 pandas

以下从CSV读取到pandas 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列中有3个同名的多个条目 he.com_300x250_bottomloopmobile he.com_300x250_bottomloopmobile 中的4个)
  2. 除了第一个之外的所有列,C列将始终为空白 独特的价值。
  3. enter image description here

    我现在需要求和这些多个值" key"对于列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"']中添加以尝试重建完整公式时,pandas不再删除重复项:

    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 个答案:

答案 0 :(得分:1)

您似乎需要将输出分配给wb - groupby,其中sum汇总所有数字列,因此没有重复项,最后为as_index=False输出添加DataFrame

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\xbfencoding='utf-8-sig'添加到read_csv或将pandas升级到上一版本,因为此错误为closed and solved