大熊猫计数率

时间:2015-06-20 07:43:26

标签: python pandas

我想使用pandas for python package总结csv表。

该表有如下方案

name_id | visit_address_no
   0    |       230
   0    |       223
   0    |       230
   2    |       120
   2    |       120
   2    |       132
   2    |       110

我想总结一下这个表,如下所示

name_id | visit_address_no | visit_count | visit_rate
   0    |       230        |      2      |    0.666
   0    |       223        |      1      |    0.333
   2    |       120        |      2      |    0.5
   2    |       132        |      1      |    0.25
   2    |       110        |      1      |    0.25

如何使用pandas

为csv表制作此摘要

我试过

gb = df.groupby(['name_no', 'visit_address_no'])
gb.size()

但我无法获得率和熊猫数据框样式。

3 个答案:

答案 0 :(得分:2)

df['name_count'] = df.groupby(['name_id'])['name_id'].transform(len)
df['visit_count'] = df.groupby(['name_id', 'visit_address_no'])['name_id'].transform(len)
summary_df = df.groupby(['name_id', 'visit_address_no']).agg('mean').reset_index()
summary_df['visit_rate'] = summary_df['visit_count']/summary_df['name_count']

这会添加额外的列name_count,您可以使用summary_df.drop(['name_count], axis=1, inplace=True)删除该列。它也让我觉得有些不雅 - 我怀疑第二和第三行可以合并。

编辑 - 嗯,这是更聪明的方式:

df['name_count'] = df.groupby(['name_id'])['name_id'].transform(len)
grps = df.groupby(['name_id', 'visit_address_no'])['name_count']
summary_df = grps.agg({'visit_count': 'count',
                       'visit_rate': lambda x: len(x)/mean(x)}).reset_index()

答案 1 :(得分:1)

def f(s):
    count = s.value_counts()
    rate = count / count.sum()
    return pd.DataFrame({"count":count, "rate":rate})

df2 = df.groupby("name_id")["visit_address_no"].apply(f).reset_index()

答案 2 :(得分:0)

首先,

确保正确引用列。 在你的代码中你说

gb = df.groupby(['name_no', 'visit_address_no'])

这应该与您的数据框中的name_id相似

还要确保name_id不是您的索引。 创建df时请确保使用

df = pd.DataFrame.from_csv('Book1.csv', index_col=False)