使用python根据csv下面第n行的值有条件地更改当前行的值

使用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”

我试图根据当前行下面第n行的值,有条件地更改当前行的值。例如,假设我有一个csv文件,看起来像:

   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