我有一个带有列的 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 |
我尝试使用循环,但找不到一种干净的方法来引用“下一个相同的值”。 有什么简单的解决方案吗?
答案 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 和 1key
(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