【问题标题】:How to remove successive similar numbers in a pandas DF column如何在熊猫 DF 列中删除连续的相似数字
【发布时间】: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 然后因为它在空字符串之后

标签: python-3.x pandas loops


【解决方案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

【讨论】:

    猜你喜欢
    • 2021-04-10
    • 2020-02-25
    • 2021-06-18
    • 2013-10-28
    • 1970-01-01
    • 2019-05-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多