Как получить доступ к данным предыдущих строк в панде dataframe? - PullRequest
1 голос
/ 10 мая 2019

Я пытаюсь получить доступ к предыдущей (или далее назад) строке, чтобы использовать ее в качестве значения в новом столбце.Перепробовал несколько подходов с 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

1 Ответ

0 голосов
/ 10 мая 2019

Не используйте 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 или False соответственно.Вы хотите, чтобы столбец значений shifted

Ваше решение не работает, потому что вы всегда перебираете весь DataFrame (что почти никогда не получается), останавливаясь только после переборапоследняя строка, поэтому возвращает последнее значение.

...