我有以下数据:
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
代码有什么问题? 谢谢大家!!!
答案 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