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

时间:2021-04-29 10:46:32

标签: python-3.x pandas loops

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

当前的熊猫 DF

<头>
时间 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

我想要的

<头>
时间 value
1:00 0
2:00
3:00
4:00 1
5:00
6:00
7:00
8:00
9:00 0

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

2 个答案:

答案 0 :(得分:6)

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 处理空字符串
  • f向前fill处理NaN以获得 0 和 1 的流
  • group 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

答案 1 :(得分:2)

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

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
相关问题