Выбор неповторяющихся значений в столбцах данных - PullRequest
2 голосов
/ 22 марта 2019

У меня есть следующий фрейм данных.

import pandas as pd
dates = pd.date_range('20130101', periods=10)
df = pd.DataFrame([1,1,1,-1,-1,-1,1,1,-1,1], index=dates, columns=list('A'))

Ожидаемый результат от df

df_out=pd.DataFrame([1,0,0,-1,0,0,1,0,-1,1], index=dates, columns=list('A'))

Я хочу выбрать альтернативные +1 и -1 и заменить ноль при повторении.

df может быть большим кадром данных из 10 столбцов, и я хочу это преобразование для всех столбцов. Какой эффективный способ без использования для цикла? Пожалуйста, предложите путь вперед. Благодарю в ожидании.

Ответы [ 4 ]

2 голосов
/ 22 марта 2019

IIUC вы можете использовать Series.diff вместе с ne, чтобы проверить, какие первые различия не 0 или другими словами, какие последующие значения не повторяются, и замените те, которые False на 0, используя DataFrame.where:

df.where(df.A.diff().ne(0), 0)

            A
2013-01-01  1
2013-01-02  0
2013-01-03  0
2013-01-04 -1
2013-01-05  0
2013-01-06  0
2013-01-07  1
2013-01-08  0
2013-01-09 -1
2013-01-10  1
2 голосов
/ 22 марта 2019

Попробуйте:

df['A'] = df['A'] * (df['A'].diff() != 0)

Как это работает:

diff() вычисляет разницу между последовательными значениями в вашей серии.Если разность равна 0, то мы знаем, что было повторение.

Поэтому мы можем сделать проверку != 0, которая создаст логическую серию, которая будет True, где бы не было повторения, и false, где было повторение..

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

2 голосов
/ 22 марта 2019

Попробуйте использовать np.where():

df.A=np.where(df.A.ne(df.A.shift()),df.A,0)
print(df)

            A
2013-01-01  1
2013-01-02  0
2013-01-03  0
2013-01-04 -1
2013-01-05  0
2013-01-06  0
2013-01-07  1
2013-01-08  0
2013-01-09 -1
2013-01-10  1
0 голосов
/ 22 марта 2019

Третий вариант:

import pandas as pd
import numpy as np

def check_dup(data):
    print(data)
    if data[0] == data[1]:
        return 0
    else:
        return data[1]

df = pd.DataFrame(np.random.randint(0,2, (10,1))*2-1)

df.rolling(window=2).apply(check_dup, raw=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...