我正在阅读带有pandas的CSV文件,在我读完文件后,我想计算两件事:
例如,如果我的数据是[X,X,Y,Z,Z,X,X,Y,Z,Y]
,我希望我的输出为
X 4 40.0
Y 3 30.0
Z 3 30.0
我尝试了以下但只输出总和
train = pd.read_csv("./../input/train.csv")
grouped = train.groupby([x ,y]).size()
这只计算百分比:
train = pd.read_csv("./../input/train.csv")
grouped = grouped.groupby(level=[0]).apply(lambda x: x / x.sum())
我怎样才能同时获得两者?
答案 0 :(得分:3)
我认为需要按sum
的{{3}}新计数列除以百分比列:
df = pd.DataFrame({'A':list('XXYZZXXYZY')})
df = df.groupby('A').size().reset_index(name='count')
df['%'] = df['count'].div(df['count'].sum()).mul(100)
print (df)
A count %
0 X 4 40.0
1 Y 3 30.0
2 Z 3 30.0
使用div
的替代解决方案:
df = pd.concat([df['A'].value_counts().rename('count'),
df['A'].value_counts(normalize=True).rename('%').mul(100)], axis=1)
df = df.rename_axis('A').reset_index()
print (df)
A count %
0 X 4 40.0
1 Y 3 30.0
2 Z 3 30.0
答案 1 :(得分:1)
我会分别计算两者并将它们连接起来:
d = {'col_one': ['X','X','Y','Z','Z','X','X','Y','Z','Y']}
df = pd.DataFrame(data=d)
nb_rows = len(df)
serie_count = df.groupby('col_one').size().rename('count')
serie_percentage = (100.*serie_count/nb_rows).rename('percentage')
final_df = pd.concat([serie_count, serie_percentage], axis=1)
输出:
count percentage
col_one
X 4 40.0
Y 3 30.0
Z 3 30.0