在pandas中groupby后添加新列

1 投票
2 回答
1820 浏览
提问于 2025-04-18 08:42

我正在使用pandas来处理一个结构如下的csv文件

date, student, score, outof
20040601,mark,80,100
20040601,jack,40,100
20040602,mark,60,100
20040602,jack,30,100

我想按日期对上述数据进行分组,然后计算每个日期的百分比,最后把它画出来。

我可以通过以下代码来进行分组

import pandas as pd
data = pd.read_csv("csv_file")
grouped_by_date = data.groupby('date')

我也能用以下代码计算每一行的百分比

import pandas as pd
data = pd.read_csv("csv_file")
date['percentage'] = data['score']/data['outof']

但是我不知道怎么在分组后的数据上进行这个计算。该怎么在分组数据上操作呢?

编辑

以下是我想要的输出结果

date, percentage
20040601,60
20040602,45

2 个回答

1

以下是我会做的事情:

>>> df.set_index(['date'], inplace=True)
>>> df['percentDate'] = df.groupby(level=0).apply(lambda x: np.mean(x['score']/x['outof']))
>>> df
Out[391]: 
         student  score  outof  percentDate
date                                         
20040601    mark     80    100           0.60
20040601    jack     40    100           0.60
20040602    mark     60    100           0.45
20040602    jack     30    100           0.45

首先,因为你想把这些值放到数据框(dataframe)的一列中,所以最好根据你分组的内容来设置索引:这样后面设置值会更简单(对我来说是这样的)。

其次,注意我使用了numpy的 mean() 函数:因为分数除以总分会返回一列观察值(每个学生一行),你需要对这些值进行平均。

1

简单来说:

data['percentage'] = data.score/data.outof
data.groupby('date').mean()

结果是:

          score  outof  percentage
date                              
20040601     60    100        0.60
20040602     45    100        0.45

撰写回答