将groupby的总和作为具有Pandas中不同值的新列

Bir*_*ish 0 python dataframe pandas

这就是我的数据的样子:

id      date        rt      dnm
101122  2017-01-24  0.0     70
101122  2017-01-08  0.0     49
101122  2017-04-13  0.02976 67
101122  2017-08-03  1.02565 39
101122  2016-12-01  0.0     46
101122  2017-01-25  0.0     69
101122  2017-01-02  0.0     76
101122  2017-07-18  0.02631 38
101122  2016-06-02  0.0     120
221344  2016-10-21  0.00182 176
221344  2016-09-21  0.47732 194
221344  2016-06-23  0.0     169
221344  2017-10-10  0.91391 151
221344  2017-04-29  0.0     33
221344  2017-02-05  0.0     31
221344  2017-10-16  0.0     196
221344  2016-09-25  0.0     33
221344  2016-07-17  0.0     21
221344  2016-07-21  0.0     46
615695  2017-07-12  0.0     21
615695  2017-07-05  0.0     18
615695  2016-07-11  0.0     38
615695  2016-07-19  0.03655 29
615695  2017-05-27  0.0     23
615695  2017-12-22  0.0     20
615695  2017-04-25  0.0     34
615695  2017-03-23  0.0     20
615695  2016-09-23  0.0     25
615695  2016-06-18  0.0     25
Run Code Online (Sandbox Code Playgroud)

我正在尝试为每个'id'获取'dmn'列的总和,并为这个新列命名为'sum_values'.之后我需要得到'sum_values'高于300的id.以下代码生成第一部分:

data = pd.read_csv(file_name, sep='\t', header=0, 
                   parse_dates=[1], infer_datetime_format=True);    

test = (data.assign(sum_values = data.groupby('id')['dnm'].transform(np.sum))
                                                          .query('sum_values > 300'))
Run Code Online (Sandbox Code Playgroud)

这将添加一个名为"sum_values"的新列,并多次重复每个id的和值.我需要获得'id'和'sum_values'列的唯一值.但我无法弄清楚如何/在哪里添加nunique().

这是期望的结果:

id        sum_values(>300)
101122     574
221344     1050
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

use*_*203 5

groupbysum

d = df.groupby('id')['dnm'].sum()
Run Code Online (Sandbox Code Playgroud)

indexing

d[d > 500]

id
101122     574
221344    1050
Name: dnm, dtype: int64
Run Code Online (Sandbox Code Playgroud)

如果要在输出中使用列名,只需使用 d[d > 500].reset_index()