我有一个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}}
答案 0 :(得分:1)
让f
成为用于过滤数据框的函数,其中i
是col_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