Я пытаюсь сравнить значение текущего индекса со значением следующего индекса в моем фрейме данных pandas. Я могу получить доступ к значению с помощью iloc, но когда я пишу условие if для проверки значения. Это дает мне ошибку.

Код, который я пробовал:

df = pd.DataFrame({'Col1': [2.5, 1.5, 3 , 3 ,4.8 , 4 ]})

trend = list()
for k in range(len(df)):
    if df.iloc[k+1] > df.iloc[k]:
        trend.append('up')
    if df.iloc[k+1] < df.iloc[k]:
        trend.append('down')
    if df.iloc[k+1] == df.iloc[k]:
        trend.append('nochange')

dftrend = pd.DataFrame(trend)


ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Я попытался присвоить значение iloc[k] переменной "current" с помощью astype=int. Тем не менее, я не могу использовать переменную "current" в моей проверке условия if. Спасибо, если кто-то может помочь с информацией о том, как ее решить.

2
Raj Kumar 25 Дек 2019 в 13:08

4 ответа

Итак, что я сделал, так это то, что я преобразовал этот конкретный столбец в список. Вместо того, чтобы работать напрямую с объектом Series, возвращаемым фреймом данных, я предпочитаю сначала преобразовать его в массив list или numpy, а затем выполнять над ним основные функции. Я также дал правильный рабочий код ниже.

import pandas as pd
df = pd.DataFrame({'Col1': [2.5, 1.5, 3 , 3 ,4.8 , 4 ]})
trend = list()
temp=df['Col1'].tolist()
print(temp)
for k in range(len(df)-1):
    if temp[k+1] > temp[k]:
        trend.append('up')
    if temp[k+1] < temp[k]:
        trend.append('down')
    if temp[k+1] == temp[k]:
        trend.append('nochange')

dftrend = pd.DataFrame(trend)

print(trend)
0
Niveth Saran 25 Дек 2019 в 13:25

Вот подход, более похожий на панд. Мы можем легко получить разницу между двумя последовательными элементами ряда с помощью pandas.DataFrame.diff:

import pandas as pd

df = pd.DataFrame({'Col1': [2.5, 1.5, 3 , 3 ,4.8 , 4 ]})
df_diff = df.diff()

   Col1
0   NaN
1  -1.0
2   1.5
3   0.0
4   1.8
5  -0.8

Теперь вы можете применить функцию поэлементно, которая выделяет только >0, <0 или ==0, используя pandas.DataFrame.applymap

def direction(x):
    if x > 0:
        return 'up'
    elif x < 0:
        return 'down'
    elif x == 0:
        return 'nochange'

df_diff.applymap(direction))

       Col1
0      None
1      down
2        up
3  nochange
4        up
5      down

Наконец, это дизайнерское решение, что должно произойти с первым значением ряда. Здесь значение NaN ни в коем случае не подходит. Вы также можете обработать его отдельно в direction или опустить в своем результате путем нарезки.


Изменить : то же самое, что и одиночная подводка:

df.diff().applymap(lambda x: 'up' if x > 0 else ('down' if x < 0 else ('nochange' if x == 0 else None)))
0
ascripter 25 Дек 2019 в 13:37

Вы можете использовать это:

 df['trend'] = np.where(df.Col1.shift().isnull(), "N/A", np.where(df.Col1 == df.Col1.shift(), "nochange", np.where(df.Col1 < df.Col1.shift(), "down", "up")))


   Col1     trend
0   2.5       N/A
1   1.5      down
2   3.0        up
3   3.0  nochange
4   4.8        up
5   4.0      down
0
oppressionslayer 25 Дек 2019 в 14:06

Вы получаете сообщение об ошибке, потому что

df.iloc[k] дает вам pd.Series.

Вы можете использовать сказать df.iloc[k,0], чтобы получить значение Col1

0
abhilb 25 Дек 2019 в 13:23