Python 3.x 如何删除列中连续的相似数字

Python 3.x 如何删除列中连续的相似数字,python-3.x,pandas,loops,Python 3.x,Pandas,Loops,我有一个带列的DF-此列可以有3个值,0、1或“”(参见下面的示例)。 我要做的是删除所有类似的连续数字。所以0永远不能跟在0后面,1永远不能跟在1后面。相反,我想用“”替换这些 当前数据集 时间 价值 1:00 0 2:00 3:00 0 4:00 1. 5:00 6:00 7:00 1. 8:00 1. 9:00 0 itertools解决方案: from itertools import chain, groupby df.value = list(chain.from_iterable

我有一个带列的DF-此列可以有3个值,0、1或“”(参见下面的示例)。 我要做的是删除所有类似的连续数字。所以0永远不能跟在0后面,1永远不能跟在1后面。相反,我想用“”替换这些

当前数据集

时间 价值 1:00 0 2:00 3:00 0 4:00 1. 5:00 6:00 7:00 1. 8:00 1. 9:00 0
itertools
解决方案:

from itertools import chain, groupby

df.value = list(chain.from_iterable(
                          [key, *['']*(len(list(gr))-1)]
                          for key, gr in groupby(df.value.replace("", np.nan).ffill())
                      )
           )
  • replace
    ing空字符串为
    np.nan
  • f
    orward
    fill
    ing
    NaN
    s以获得0和1的流
  • 分组
    ing
    by
    0和1
  • (0或1)与一些空字符串(组的长度为-1)放回原处
  • 使用
    chain.from\u iterable
  • 强制转换到
    列表
    以将其分配回数据帧
得到

   time value
0  1:00     0
1  2:00
2  3:00
3  4:00     1
4  5:00
5  6:00
6  7:00
7  8:00
8  9:00     0

我们可以在
value
上使用
loc
删除具有空字符串的行,然后
shift
并比较过滤后的行以创建布尔掩码,然后
mask
布尔掩码保持为真的空字符串值

s = df['value'].loc[lambda x: x != '']
m = s.eq(s.shift())
df.loc[m[m].index, 'value'] = ''


在输出3:00时也应该有0,因为它是在空字符串之后,这太棒了!工作起来很有魅力!这是
itertools.groupby
   time value
0  1:00   0
1  2:00      
2  3:00      
3  4:00   1
4  5:00      
5  6:00      
6  7:00      
7  8:00      
8  9:00   0