在pandas中的groupby之后添加一个新列

时间:2014-06-05 11:20:42

标签: python csv pandas

我正在使用pandas处理具有以下结构的csv文件

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

我希望按日期对上述数据进行分组,然后计算每个日期的百分比,然后进行绘制。

我可以使用以下代码

进行groupby
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 个答案:

答案 0 :(得分: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

首先,由于您希望将值设置为数据框中的列,因此最好根据您的分组设置索引:它使得稍后设置值更容易(对我而言)。

其次,观察我使用了numpy的mean()函数:因为得分/ outof将返回一列观察结果(每个学生一行),你必须对其进行平均。

答案 1 :(得分: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