pandas只替换列的一部分[英] pandas replace only part of a column

本文是小编为大家收集整理的关于pandas只替换列的一部分的处理方法,想解了pandas只替换列的一部分的问题怎么解决?pandas只替换列的一部分问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

这是我的输入:

import pandas as pd
import numpy as np

list1 = [10,79,6,38,4,557,12,220,46,22,45,22]
list2 = [4,3,23,6,234,47,312,2,426,42,435,23]

df = pd.DataFrame({'A' : list1, 'B' : list2}, columns = ['A', 'B'])
df['C'] = np.where (df['A'] > df['B'].shift(-2), 1, np.nan)
print (df)

产生这个输出:

      A    B    C
0    10    4  NaN
1    79    3  1.0
2     6   23  NaN
3    38    6  NaN
4     4  234  NaN
5   557   47  1.0
6    12  312  NaN
7   220    2  1.0
8    46  426  NaN
9    22   42  NaN
10   45  435  NaN
11   22   23  NaN

我需要做的是将"C"列更改为一组三个连续的 1,不重叠.所需的输出是:

      A    B    C
0    10    4  NaN
1    79    3  1.0
2     6   23  1.0
3    38    6  1.0
4     4  234  NaN
5   557   47  1.0
6    12  312  1.0
7   220    2  1.0
8    46  426  NaN
9    22   42  NaN
10   45  435  NaN
11   22   23  NaN

因此,第 2、3 和 6 行从 NaN 更改为 1.0.第 7 行已经有一个 1.0,它被忽略了.第 8 行和第 9 行需要保持 NaN,因为第 7 行是前一组的最后一个条目.

我不知道是否有更好的方法来构建可以在创建时执行此操作的列"C".

我尝试了几个版本的 fillna 和 ffill,没有一个适合我.

这似乎很复杂,但我试图用这一行来隔离每个 1.0 的行 ID:

print (df.loc[df['C'] == 1])

正确输出:

     A   B    C
1   79   3  1.0
5  557  47  1.0
7  220   2  1.0

尽管我知道这些信息,但我不知道如何从那里着手.

非常感谢您提前提供的帮助,大卫

推荐答案

编辑:

更快的版本(感谢 b2002):

ii = df[pd.notnull(df.C)].index
dd = np.diff(ii)
jj = [ii[i] for i in range(1,len(ii)) if dd[i-1] > 2]
jj = [ii[0]] + jj

for ci in jj:
    df.C.values[ci:ci+3] = 1.0
<小时>

首先通过查看 C 列中不为空的点之间的差异(第一个索引包含在默认),然后遍历这些索引并使用 loc 更改 C 列的切片:

ii = df[pd.notnull(df.C)].index
dd = np.diff(ii)
jj = [ii[i] for i in range(1,len(ii)) if dd[i-1] > 2]
jj = [ii[0]] + jj

for ci in jj:
    df.loc[ci:ci+2,'C'] = 1.0

结果:

      A    B    C
0    10    4  NaN
1    79    3  1.0
2     6   23  1.0
3    38    6  1.0
4     4  234  NaN
5   557   47  1.0
6    12  312  1.0
7   220    2  1.0
8    46  426  NaN
9    22   42  NaN
10   45  435  NaN
11   22   23  NaN

本文地址:https://www.itbaoku.cn/post/1728198.html