Сравнение следующего элемента с предыдущим элементом в словаре - PullRequest
0 голосов
/ 05 января 2019

Я бы хотел сделать сравнение среди предметов в серии панд. Если элемент не равен следующему значению, добавьте его в список, иначе продолжайте. Я думаю, что мой код работает, за исключением того, что он терпит неудачу в последнем случае, потому что индекс элементов [k + 1] находится вне диапазона. Как мне получить это, чтобы прекратить сравнение в последнем ряду?

Я делаю это, потому что у меня есть набор данных, предположительно упорядоченный по дате, но у меня нет поля метки времени. Я знаю только, начиная с месяца и года и заканчивая месяцем и годом.

Однако одно включенное поле (поле euribor3m) должно быть дневным, поэтому я надеюсь, что смогу отделить каждый день, а затем создать временную метку, просто сравнивая строки со следующей строкой и замечая, если значение для поля изменилось. Если это так, это будет означать, что новые строки отображаются на новый день, и, поскольку строки упорядочены по дням, я надеюсь, что я получу общее количество x дней, соответствующих количеству дней между началом месяца-годом и концом месяца-года.

items = dict(enumerate(df['euribor3m']))
unique = []

for k,i in items.items():
    if items[k+1] != items[k]:
        unique.append(items[k+1])

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Вы можете использовать shift() для этого.

df = pd.DataFrame({'euribor3m':[5,5,7,7,8,9,11,11,34,45,45]})

df0 = df.shift()

mask = df['euribor3m']==df0['euribor3m']
df_new = df[mask]
print(list(df_new['euribor3m']))

Выход:

[5, 7, 11, 45]
0 голосов
/ 05 января 2019

Одно из решений - поймать KeyError:

for k, i in items.items():
    try:
        if items[k+1] != items[k]:
            unique.append(items[k+1])
    except KeyError:
        pass

Но вы не должны повторять этот путь в первую очередь, поскольку Pandas специализируется на векторизованных операциях. Вы можете использовать shift вместо:

df = pd.DataFrame({'euribor3m': [1, 1, 2, 3, 4, 5, 5, 6]})

res = df.loc[df['euribor3m'].shift(-1) != df['euribor3m']]

print(res)

#    euribor3m
# 1          1
# 2          2
# 3          3
# 4          4
# 6          5
# 7          6
...