如何在熊猫 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
处理空字符串
f
orward fill
ing NaN
s 获取 0 和 1 的流
group
ing 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 列中删除连续的相似数字的主要内容,如果未能解决你的问题,请参考以下文章