如何使用多个条件规范化熊猫数据列?

时间:2019-07-16 05:04:44

标签: python pandas

我正在尝试创建一个新的pandas列,该列是来自另一列的规范化数据。

我创建了三个单独的系列,然后将它们合并为一个。 虽然这种方法为我提供了理想的结果,但我想知道是否有更好的方法可以做到这一点。

x = df["Data Col"].copy()

#if the value is between 70 and 30 find the difference of the previous value. 
#Positive difference = 1 & Negative difference = -1
btw = pd.Series(np.where(x.between(30, 70, inclusive=False), x.diff(), 0))
btw[btw < 0] = -1
btw[btw > 0] = 1

#All values above 70 are -1
up = pd.Series(np.where(x.gt(70), -1, 0))

#All values below 30 are 1
dw = pd.Series(np.where(x.lt(30), 1, 0))

combined = up + dw + btw
df["Normalised Col"] = np.array(combined)

我尝试直接在Pandas数据列上使用函数和循环,但我不知道如何获取.diff()

1 个答案:

答案 0 :(得分:0)

numpy.select与链掩码一起使用,&用于按位AND|用于按位OR

np.random.seed(2019)

df = pd.DataFrame({'Data Col':np.random.randint(10, 100, size=10)})
#print (df)


d = df["Data Col"].diff()
m1 = df["Data Col"].between(30, 70, inclusive=False)
m2 = d < 0
m3 = d > 0
m4 = df["Data Col"].gt(70)
m5 = df["Data Col"].lt(30)


df["Normalised Col1"] = np.select([(m1 & m2) | m4, (m1 & m3) | m5], [-1, 1], default=0)
print (df)
   Data Col  Normalised Col1
0        82               -1
1        41               -1
2        47                1
3        98               -1
4        72               -1
5        34               -1
6        39                1
7        25                1
8        22                1
9        26                1