使用python根据csv下面第n行的值有条件地更改当前行的值
我试图根据当前行下面第n行的值,有条件地更改当前行的值。例如,假设我有一个csv文件,看起来像:使用python根据csv下面第n行的值有条件地更改当前行的值,python,python-3.x,python-2.7,pandas,csv,Python,Python 3.x,Python 2.7,Pandas,Csv,我试图根据当前行下面第n行的值,有条件地更改当前行的值。例如,假设我有一个csv文件,看起来像: trial '' '' '' '' '' '' '' 'a' '' '' '' '' '' '' '' 'a' '' '' '' '' '' '' '' 'a' 现在,如果当前行之后每第三行的值为“a”
trial
''
''
''
''
''
''
''
'a'
''
''
''
''
''
''
''
'a'
''
''
''
''
''
''
''
'a'
现在,如果当前行之后每第三行的值为“a”,则null将从当前行转换为下面第三行的“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']
[]
[]
您知道如何执行此操作吗?您可以使用
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
您需要使用
回填fillna
首先,您需要确保您的空值实际上是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
你能让这更易读些吗?如果您不介意在列中使用NaN值,请选中“摆脱上一次替换”,而不是”
,您的解决方案简短而优雅!非常感谢你@ALollz
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