2015-06-20 141 views
1

我想总结一下使用pandas进行python包的csv表。pandas groupby计数率

表中有像下面

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() 

,但我不能让速度和熊猫数据帧的风格。

+0

其中'visit_count'来自目前尚不清楚,但它需要计算的'visit_rate'。 – cel

回答

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
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() 
0

首先,

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

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

这应该在你的数据帧

来名_ID像还要确保名_ID是不是你的索引。 在创建DF确保您使用

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