如何在熊猫 DF 列中删除连续的相似数字

Posted

技术标签:

【中文标题】如何在熊猫 DF 列中删除连续的相似数字【英文标题】:How to remove successive similar numbers in a pandas DF column 【发布时间】:2021-07-22 17:32:26 【问题描述】:

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

当前的 pandas DF

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

我想要什么

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

我尝试使用循环,但找不到一种干净的方式来引用“下一个相同的值”。 有什么简单的解决方案吗?

【问题讨论】:

在输出 3:00 也应该有 0 然后因为它在空字符串之后 【参考方案1】:

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使用np.nan 处理空字符串 forward filling NaNs 获取 0 和 1 的流 grouping by 0 和 1 放回 key(0 或 1)以及一些空字符串(组的长度 - 1) 使用chain.from_iterable 展平这些块 转换为 list 以将其分配回数据帧

得到

   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

【讨论】:

这太棒了!像魅力一样工作! itertools.groupby 很好用【参考方案2】:

我们可以在value 上使用loc 删除具有空字符串的行,然后使用shift 并比较过滤后的行以创建一个布尔掩码,接下来mask 具有布尔掩码所在的空字符串的值是的

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

   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

【讨论】:

以上是关于如何在熊猫 DF 列中删除连续的相似数字的主要内容,如果未能解决你的问题,请参考以下文章

如何一次从熊猫的所有列中删除逗号

删除熊猫数据框中“标签”列中出现数字后的空格

如果特定列中的值不是熊猫数据框中的整数,则删除行

如何从熊猫数据框中的列中删除字符串值

如何摆脱我们熊猫数据框中的相等列?

如何在熊猫中获得连续滚动平均值?