我试图根据它下面第N行的值有条件地更改当前行的值。比方说,我有一个csv文件,看起来像:
trial
''
''
''
''
''
''
''
'a'
''
''
''
''
''
''
''
'a'
''
''
''
''
''
''
''
'a'
现在,如果当前行之后的每第3行的值为'a',则null将从当前行转换为'a'到下面的第3行。 就这样:
trial
''
''
''
''
'a'
'a'
'a'
'a'
''
''
''
''
'a'
'a'
'a'
'a'
''
''
''
''
'a'
'a'
'a'
'a'
我的代码如下:
data =csv.reader(data)
next(data)
def convert(param):
if param=='':
value='a'
else:
value=''
return value
for row in data:
i=0
for line in islice(data, i+3, None):
print i
print line
print row
if line==['a']:
convert(row)
print row
i = i+1
然而,输出是:
0
[]
[]
[]
1
[]
[]
[]
2
[]
[]
[]
3
['a']
[]
[]
4
[]
[]
[]
5
[]
[]
[]
6
[]
[]
[]
7
[]
[]
[]
8
[]
[]
[]
9
[]
[]
[]
10
[]
[]
[]
11
[]
[]
[]
12
[]
[]
[]
13
['a']
[]
[]
14
[]
[]
[]
15
[]
[]
[]
16
[]
[]
[]
17
[]
[]
[]
18
[]
[]
[]
19
[]
[]
[]
20
[]
[]
[]
21
[]
[]
[]
22
[]
[]
[]
23
['a']
[]
[]
关于如何做到这一点的任何想法?
答案 0 :(得分:1)
您希望fillna
与backfill
首先,您需要确保空值实际上是pandas识别的空值,所以
import pandas as pd
import numpy as np
df = df.replace('', np.NaN).fillna(method='bfill', limit=3).replace(np.NaN, '')
trial
0
1
2
3
4 a
5 a
6 a
7 a
8
9
10
11
12 a
13 a
14 a
15 a
16
17
18
19
20 a
21 a
22 a
23 a
答案 1 :(得分:0)
您可以使用iterrows()
迭代行以获得结果:
# if the values have quotes, you can remove the quotes first
df1['trial'] = df1['trial'].str.replace("'",'')
for index, row in df1.iterrows():
if row['trial'] == 'a':
df1.loc[index-3:index, 'trial'] = 'a'
else:
continue
# output
trial
0
1
2
3
4 a
5 a
6 a
7 a
8
9
10
11
12 a
13 a
14 a
15 a
16
17
18
19
20 a
21 a
22 a
23 a