说我有一个数据,可以用深度(米)标记水的存在:
Depth Water
1.9
1.91
2
2.92
2.94
2.97
2.98
3 1
3.02
3.03
3.05
3.07
3.11
4.08
4.11 1
5.12
5.22
6.13
6.18
6.2
6.22 1
7.12
7.45
7.6
8.6 1
我想使用熊猫对此进行回填,以使上方的每一米都将被标记为1,如下所示:
Depth Water
1.9
1.91
2 1
2.92 1
2.94 1
2.97 1
2.98 1
3 1
3.02
3.03
3.05
3.07
3.11 1
4.08 1
4.11 1
5.12
5.22 1
6.13 1
6.18 1
6.2 1
6.22 1
7.12
7.45
7.6 1
8.6 1
我的Scratch代码如下:
#create function that will tag 1:
def label_water(row):
if row['Water'] == '1' :
return 1
else:
return ''
for i in np.where(df['Water']==1):
for j in i: # j is the lower depth
k = j-1 #k is now the upper depth
data['Water']=df.apply(lambda row: label_water(row) if k<df['Depth']<j)
但是它会返回语法错误,我缺少什么吗?
答案 0 :(得分:1)
我认为需要transform
和last
和助手Series
并减去列Depth
,最后根据条件设置值:
s = df.groupby(df['Water'].iloc[::-1].eq('1').cumsum())['Depth'].transform('last')-df['Depth']
df['Water'] = np.where(s <=1, '1', '')
print (df)
Depth Water
0 1.90
1 1.91
2 2.00 1
3 2.92 1
4 2.94 1
5 2.97 1
6 2.98 1
7 3.00 1
8 3.02
9 3.03
10 3.05
11 3.07
12 3.11
13 4.08 1
14 4.11 1
15 5.12
16 5.22 1
17 6.13 1
18 6.18 1
19 6.20 1
20 6.22 1
21 7.12
22 7.45
23 7.60 1
24 8.60 1
详细信息:
print (df['Water'].iloc[::-1].eq('1').cumsum())
24 1
23 1
22 1
21 1
20 2
19 2
18 2
17 2
16 2
15 2
14 3
13 3
12 3
11 3
10 3
9 3
8 3
7 4
6 4
5 4
4 4
3 4
2 4
1 4
0 4
Name: Water, dtype: int32
print (s)
0 1.10
1 1.09
2 1.00
3 0.08
4 0.06
5 0.03
6 0.02
7 0.00
8 1.09
9 1.08
10 1.06
11 1.04
12 1.00
13 0.03
14 0.00
15 1.10
16 1.00
17 0.09
18 0.04
19 0.02
20 0.00
21 1.48
22 1.15
23 1.00
24 0.00
Name: Depth, dtype: float64