python - 修改数据帧列中一对值之间的所有值

标签 python pandas dataframe

有一个数据框由一列数字组成,其中仅包含“0,1,2”。其中‘1’和‘2’交替出现,不会连续出现两个‘1’或两个‘2’。

我的目标是将此列中 1 到 2 之间的所有值(从 1 开始,包括 1 和 2)更改为特殊值“9”。也许我可以通过循环整个 df 来做到这一点,但我想知道 pandas 是否有更简单的方法来做到这一点?

df = pd.DataFrame({'a':[2, 0, 1, 2, 0, 1, 0, 0, 2, 0, 1, 0, 0, 2, 0, 1]})

>>> df
    a  desired
0   2        2
1   0        0
2   1        9
3   2        9
4   0        0
5   1        9
6   0        9
7   0        9
8   2        9
9   0        0
10  1        9
11  0        9
12  0        9
13  2        9
14  0        0
15  1        1

最佳答案

IIUC,可以组成以1开头的正向组,以2结尾的反向组,然后组成普通组。如果一组以 1 开始并以 2 结束,则用 9 填充它:

g1 = df['a'].eq(1).cumsum()
g2 = df['a'].eq(2)[::-1].cumsum()

m = df.groupby([g1, g2])['a'].transform(lambda g: g.iloc[0]==1 and g.iloc[-1]==2)

df['desired'] = pd.Series(9, index=m.index).mask(~m, df['a'])

输出:

    a  desired
0   2        2
1   0        0
2   1        9
3   2        9
4   0        0
5   1        9
6   0        9
7   0        9
8   2        9
9   0        0
10  1        9
11  0        9
12  0        9
13  2        9
14  0        0
15  1        1

关于python - 修改数据帧列中一对值之间的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73459689/

相关文章:

Python selenium打印框架源码

Python正则表达式4个字母的单词,至少1个大写字母

python - 从另一个 DataFrame 的列中的 JSON URL 生成 Dataframe

r - 通过函数更新数据框以找到连续的最佳值

r - 计算一系列行的平均值

python - 从中获取最小值的数据帧的名称

python - 数据集不适合 LSTM 训练的内存

python - python Pandas/numpy 的 R 的 match() 等价物是什么?

python - pandas - Groupby 加权条形图

python - 使用 pyodbc 和 pandas 将 CSV 加载到 .mdb