根据指定的深度动态回填Pandas DataFrame

时间:2018-07-24 06:20:05

标签: python pandas dataframe

说我有一个数据,可以用深度(米)标记水的存在:

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)

但是它会返回语法错误,我缺少什么吗?

1 个答案:

答案 0 :(得分:1)

我认为需要transformlast和助手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