python - 替换 Pandas DataFrame 列中超过 n 个连续值

标签 python pandas replace multiple-columns cumsum

假设我有以下 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 和其余的 5 替换任何列(可能有数百列)中连续重复 10 次以上的数字 4。

因此,例如,12 个连续的 4 将被替换为十个 4 和两个 5。

我如何使用 Pandas 实现这一目标?

我想应用 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]})

如果 NaNwhere 创建,解决方案将连续计数 4 并重置然后将 boolean mask 应用于原始 df 以将 4 替换为 5 by mask :

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

关于python - 替换 Pandas DataFrame 列中超过 n 个连续值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42946226/

相关文章:

python - 如何在 map 函数中使用 strip

将与另一个 data.frame 中的行名匹配的列中的值替换为关联值

c++ - visual studio 查找替换

python - 控制OpenCV凸包

Python 3 winreg : unable to write to the Windows registry

python - 如何替换 Pandas 中的异常值数据?

python - 如何在Python中格式化具有多列但单行的数据框?

python-2.7 - 如何仅添加公共(public)索引pandas数据框?

mysql - 表达式中的 REPLACE 和 IF 会导致上一行的串联

python - 如何在python中转义正则表达式的所有特殊字符