我正在尝试访问前一行(或后退)以用作新列中的值。用枚举,迭代和iloc尝试了几种方法,但最终遇到相同的问题,它们使用最后一个值。使用以下代码:
df = pd.DataFrame({'values':(50.033,50.025,49.979,49.954,49.936,49.935,49.93)})
df['a']=df.diff()
def my_func_disch(x):
if abs(x) >= 0 and abs(x) <= 0.009:
for index,row in df.iterrows():
eff_disch = row['values']
else:
eff_disch = 'xxx'
return eff_disch
df["b"] = df.a.apply(my_func_disch)
哪个产生:
values a b
0 50.033 NaN xxx
1 50.025 -0.008 49.93
2 49.979 -0.046 xxx
3 49.954 -0.025 xxx
4 49.936 -0.019 xxx
5 49.935 0.000 49.93
6 49.930 -0.005 49.93
我希望它产生:
values a b
0 50.033 NaN xxx
1 50.025 -0.008 50.033
2 49.979 -0.046 xxx
3 49.954 -0.025 xxx
4 49.936 -0.019 xxx
5 49.935 0.000 49.936
6 49.930 -0.005 49.935
答案 0 :(得分:0)
请勿使用apply
,而应使用矢量化的np.where
,该方法更快,更易读:
df['b'] = np.where(df['a'].abs().between(0, 0.009, inclusive=True), df['values'].shift(), 'xxx')
# values a b
#0 50.033 NaN xxx
#1 50.025 -0.008 50.033
#2 49.979 -0.046 xxx
#3 49.954 -0.025 xxx
#4 49.936 -0.019 xxx
#5 49.935 0.000 49.93600000000001
#6 49.930 -0.005 49.935
第一个参数指定何时执行操作(当abs
为between
某些值时),第二和第三个参数指定为True
或{{1}时返回的内容} 分别。您需要值列shifted
您的解决方案不起作用,因为您总是在整个DataFrame上进行迭代(这几乎是不可能的),只是在对最后一行进行迭代之后才停止,因此返回最后一个值。