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

时间:2018-03-27 15:21:53

标签: python python-3.x python-2.7 pandas csv

我试图根据它下面第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']
[]
[]

关于如何做到这一点的任何想法?

2 个答案:

答案 0 :(得分:1)

您希望fillnabackfill

首先,您需要确保空值实际上是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