我有以下数据框。
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循环的有效方法是什么? 请提出前进的方向。谢谢期待。
答案 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.diff
与ne
一起使用,以检查哪些第一个差异不是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)