我想使用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
?
我试过
gb = df.groupby(['name_no', 'visit_address_no'])
gb.size()
但我无法获得率和熊猫数据框样式。
答案 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)