在数据框列中选择非重复值

时间:2019-03-22 11:54:54

标签: python pandas dataframe

我有以下数据框。

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列的大数据框,我希望在所有列上都进行此转换。不使用for循环的有效方法是什么? 请提出前进的方向。谢谢期待。

4 个答案:

答案 0 :(得分:2)

尝试使用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

答案 1 :(得分:2)

IIUC,您可以将Series.diffne一起使用,以检查哪些第一个差异不是0,或者换句话说,哪些后续值不重复,并替换那些{ {1}}与False使用DataFrame.where

0

答案 2 :(得分:2)

尝试:

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

这是如何工作的:

diff()计算系列中连续值之间的差。如果diff为0,那么我们知道有重复。

因此,我们可以进行!= 0检查,以创建一个布尔序列,在没有重复的地方为True,在没有重复的地方为false。

布尔序列可以用作零和一的序列,并与原始序列相乘,从而将所有重复归零。

答案 3 :(得分:0)

第三种选择:

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)