python – 在Pandas DataFrame列中替换n个连续值
作者:互联网
假设我有以下DataFrame df
df = pd.DataFrame({"a" : [1,2,2,2,2,2,2,2,2,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5], "b" : [3,3,3,3,3,3,3,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,7,7], "c" : [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,1,2,2,2,2,2,2,2,2,3,3]})
而且我希望替换连续重复10次以上任意列(可能有数百列)的4号,其中10 4个,其余5个.
因此,例如,12个连续4个将被替换为10个4和2个5.
我如何用熊猫实现这一目标?
我想应用一个lambda,但我不知道如何回顾足够的行,它必须从最后开始并向前移动,否则会破坏值的序列.每次查找都必须查看前面的10行,看它们是否都等于4,如果是,则将当前值设置为5.
不知道如何去做!
解决方法:
您可以使用:
#column a is changed for 2 groups of 4
df = pd.DataFrame({
"a" : [4,4,4,4,4,4,4,4,4,4,4,4,4,4,7,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5],
"b" : [3,3,3,3,3,3,3,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,7,7],
"c" : [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,1,2,2,2,2,2,2,2,2,3,3]})
如果由where
创建NaN,则解决方案将连续4次重置为计数,然后在mask
之前将布尔掩码应用于原始df以替换4到5:
a = df == 4
mask = a.cumsum()-a.cumsum().where(~a).ffill().fillna(0) > 10
df1 = df.mask(mask, 5)
print (df1)
a b c
0 4 3 4
1 4 3 4
2 4 3 4
3 4 3 4
4 4 3 4
5 4 3 4
6 4 3 4
7 4 4 4
8 4 4 4
9 4 4 4
10 5 4 5
11 5 5 5
12 5 5 5
13 5 5 5
14 7 5 5
15 4 5 5
16 4 5 5
17 4 5 5
18 4 5 5
19 4 5 5
20 4 5 5
21 4 5 1
22 4 5 2
23 4 5 2
24 4 5 2
25 5 5 2
26 5 5 2
27 5 5 2
28 5 6 2
29 5 6 2
30 5 7 3
31 5 7 3
为了更好地检查值,可以使用concat:
print (pd.concat([df, df1], axis=1, keys=['orig','new']))
orig new
a b c a b c
0 4 3 4 4 3 4
1 4 3 4 4 3 4
2 4 3 4 4 3 4
3 4 3 4 4 3 4
4 4 3 4 4 3 4
5 4 3 4 4 3 4
6 4 3 4 4 3 4
7 4 4 4 4 4 4
8 4 4 4 4 4 4
9 4 4 4 4 4 4
10 4 4 4 5 4 5
11 4 5 4 5 5 5
12 4 5 4 5 5 5
13 4 5 4 5 5 5
14 7 5 4 7 5 5
15 4 5 4 4 5 5
16 4 5 4 4 5 5
17 4 5 4 4 5 5
18 4 5 5 4 5 5
19 4 5 5 4 5 5
20 4 5 5 4 5 5
21 4 5 1 4 5 1
22 4 5 2 4 5 2
23 4 5 2 4 5 2
24 4 5 2 4 5 2
25 4 5 2 5 5 2
26 4 5 2 5 5 2
27 4 5 2 5 5 2
28 4 6 2 5 6 2
29 5 6 2 5 6 2
30 5 7 3 5 7 3
31 5 7 3 5 7 3
标签:cumsum,python,pandas,replace,multiple-columns 来源: https://codeday.me/bug/20190727/1552500.html