如何指定运行在其他列上的pandas groupby和聚合操作?

时间:2018-05-31 02:04:55

标签: python pandas pandas-groupby

我有一个pandas数据框如下:

+----+-------+-------+-------+
| id | col_1 | col_2 | col_3 |
+----+-------+-------+-------+
|  1 | 1.2   |     0 |     0 |
|  1 | 7.2   |     0 |     1 |
|  1 | 12.1  |     1 |     1 |
|  1 | 15.2  |     0 |     1 |
|  1 | 16.3  |     1 |     0 |
|  1 | 21.1  |     0 |     0 |
|  1 | 22.2  |     0 |     0 |
|  2 | 3     |     0 |     1 |
|  2 | 5     |     1 |     0 |
+----+-------+-------+-------+

如何使用col_1和col_2为每个id创建一个新列(col_3),对于col_1中的每个元素,如果在col_1中存在元素J,那么

1)我< J< = I + 10和 2)col_2中J的相应元素为1
col_3是1,否则为0?

例如,上面数据框的col_3将是:

{{1}}

2 个答案:

答案 0 :(得分:1)

f成为用于过滤数据框的函数,其中icol_1的值

def f(i): 
    return (df.col_2 == 1) \
         & (df.col_1 <= i + 10) \
         & (df.col_1 > i)

df['col_3'] = df.apply(lambda x: ((df.id==x.id) & f(x.col_1)).any(), axis=1).astype(int)

产生输出:

   id  col_1  col_2  col_3
0   1    1.2      0      0
1   1    7.2      0      1
2   1   12.1      1      1
3   1   15.2      0      1
4   1   16.3      1      0
5   1   21.1      0      0
6   1   22.2      0      0
7   2    3.0      0      1
8   2    5.0      1      0

答案 1 :(得分:1)

我使用的是numpy方法

l=[]
for _,x in df.groupby('id'):
    s=(((x['col_1'].values > x['col_1'].values[:, None]) &(x['col_1'].values <= (x['col_1'].values[:, None] + 10))) & x['col_2'].values.astype(bool)).any(1).astype(int).tolist()
    l.extend(s)


df['col_3']=l
df
Out[400]: 
   id  col_1  col_2  col_3
0   1    1.2      0      0
1   1    7.2      0      1
2   1   12.1      1      1
3   1   15.2      0      1
4   1   16.3      1      0
5   1   21.1      0      0
6   1   22.2      0      0
7   2    3.0      0      1
8   2    5.0      1      0