首页 > 解决方案 > 如何访问熊猫数据框中前几行的数据?

问题描述

我正在尝试访问前一行(或更后一行)以用作新列中的值。尝试了几种使用 enumerate、iterrows 和 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

标签: pythonpandasdataframe

解决方案


不要使用apply,而是使用 vectorized 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时要返回什么。你想要值列TrueFalseshifted

您的解决方案不起作用,因为您总是迭代整个 DataFrame (这几乎不是要走的路),只有在迭代最后一行后才停止,因此返回最后一个值。


推荐阅读