用其前身(Python)替换Pandas中的整行

时间:2017-05-17 20:32:24

标签: python pandas dataframe

我有以下数据:

x                         y   event
20150622.172807.769815   382
20150622.172807.769818   327
20150622.172807.769825   399  event
20150622.172807.769836   342
...
20150622.172807.769899   559

在“事件”列中,如果有事件,我想用前一行的值替换整行,如下所示:

x                         y   event
20150622.172807.769815   382
20150622.172807.769818   327
20150622.172807.769818   327
20150622.172807.769836   342
...
20150622.172807.769899   559

我的代码是:

for i, element in enumerate(df['event']):
    if element == 'event':
        df.ix[i,'event']= df['event'][i-1]
    else:
        df.ix[i,'event']= df['event'][i]

然而,它一直告诉我以下错误:

KeyError: -1

代码有什么问题? 谢谢大家!!!

3 个答案:

答案 0 :(得分:2)

如果您的event列中没有event的连续行,并且索引不重复,您可能会这样做;这里使用shift将所有行向末尾移动一个,并在事件列包含event时修改数据框;

df.loc[df.event == 'event', ['x', 'y']] = df[['x', 'y']].shift()

df
#                        x      y   event
#0  20150622.172807.769815  382.0   
#1  20150622.172807.769818  327.0   
#2  20150622.172807.769818  327.0   event
#3  20150622.172807.769836  342.0   
#4  20150622.172807.769899  559.0   

答案 1 :(得分:1)

我找到了另一种更改行的方法,在更改某些列的行时(不会更改所有列,而是更改其中一些列),这种方式非常有效。

考虑相同的数据框:

df
#                        x      y   event
0  20150622.172807.769815  382.0   
1  20150622.172807.769818  327.0   
2  20150622.172807.769825  399.0   event
3  20150622.172807.769836  342.0   
4  20150622.172807.769899  559.0   

假设你只想改变" y"列的前身。结果将是这样的:

df
#                        x      y   event
0  20150622.172807.769815  382.0   
1  20150622.172807.769818  327.0   
2  20150622.172807.769825  327.0   event
3  20150622.172807.769836  342.0   
4  20150622.172807.769899  559.0   

所以,我找到的最佳解决方案是:

df['y'] = df['y'].where(df['event']!='event',df['y'].shift())

"其中"功能对这些情况非常有帮助。虽然类似于.loc,但对我而言,它更加友好了.where。

再次感谢大家的帮助!

答案 2 :(得分:0)

运行代码时,我没有收到该错误。但是,似乎您的代码只替换了字符串event,而不是整行。以下代码(基于您的代码)为我工作(包括连续事件):

    #creating sample df    
df = pd.DataFrame({'x': [1,2,3,4,5], 'y':[1,2,3,4,5],
                 'event': ['NaN','NaN','event','event','NaN']})

        for i, element in enumerate(df['event']):
            if element == 'event':
                df.ix[i]= df.ix[i-1]

这给出了以下输出:

  event  x  y
0   NaN  1  1
1   NaN  2  2
2   NaN  2  2
3   NaN  2  2
4   NaN  5  5