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

时间:2018-05-21 13:21:38

标签: python pandas dataframe

这就是我的数据:

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

我试图得到“dmn'”的总和。每个' id'的列并为此新列命名为' sum_values'。之后,我需要获得具有' sum_values'的ID。高于300.以下代码生成第一部分:

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'))

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

这是理想的结果:

id        sum_values(>300)
101122     574
221344     1050

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

使用 groupby

sum

d = df.groupby('id')['dnm'].sum()

<强> indexing

d[d > 500]

id
101122     574
221344    1050
Name: dnm, dtype: int64

如果您想要输出中的列名,请使用d[d > 500].reset_index()

答案 1 :(得分:2)

这就是我解释你说的话

df.assign(sum_values=df.groupby('id').dnm.transform('sum')).query('sum_values > 300')

        id        date       rt  dnm  sum_values
0   101122  2017-01-24  0.00000   70         574
1   101122  2017-01-08  0.00000   49         574
2   101122  2017-04-13  0.02976   67         574
3   101122  2017-08-03  1.02565   39         574
4   101122  2016-12-01  0.00000   46         574
5   101122  2017-01-25  0.00000   69         574
6   101122  2017-01-02  0.00000   76         574
7   101122  2017-07-18  0.02631   38         574
8   101122  2016-06-02  0.00000  120         574
9   221344  2016-10-21  0.00182  176        1050
10  221344  2016-09-21  0.47732  194        1050
11  221344  2016-06-23  0.00000  169        1050
12  221344  2017-10-10  0.91391  151        1050
13  221344  2017-04-29  0.00000   33        1050
14  221344  2017-02-05  0.00000   31        1050
15  221344  2017-10-16  0.00000  196        1050
16  221344  2016-09-25  0.00000   33        1050
17  221344  2016-07-17  0.00000   21        1050
18  221344  2016-07-21  0.00000   46        1050

这就是我获得理想结果的方式。

f, u = pd.factorize(df.id)
sums = np.bincount(f, df.dnm)
mask = sums > 300
pd.DataFrame(dict(
    sum_values=sums[mask],
    ID=u[mask]
))

       ID  sum_values
0  101122       574.0
1  221344      1050.0