Pandas DataFrame:比较上一个和下一个值

时间:2019-10-25 07:05:37

标签: python python-3.x pandas numpy dataframe

我是Python和Pandas的新手,并且具有以下DataFrame

predictedFeature   offset
        2000         1
        2000         2
        0            4
        0            6
        2200          9
        2200        11
        2200         15
        2200       16
        2200         17
         0            19
         0           21  
         0            22
         0           26
         200        29
         200         31
          0          35
         200         56
         200        59
         200       71
         200        73
         100       75
         100       77
         160       79
         160       80
         100       83
           0       87
         100       89
           0       91

我正在尝试检查此列中值“ 0”的上下文。如果值为“ 0”,则需要对它的前三个和后三个值进行数组处理。

我已经有一个像required [100,162,200,262,156,160,256]这样的数组。

当我得到...

previous_array = [200,200,0]
next_array = [200,200,200] 

...我需要检查previous_array是否具有我的required数组中的值。

有人可以帮我吗?

例如,

我有上面提到的数据框。

现在,在这里存在0的地方。现在,我想用所需数组中的值替换该0。现在,

如果我们看到我在该数据帧的第3位为0。现在,如果我们采用前面的3个值,那么它本身将是2个,只有3个。

所以会是[2000,2000] 接下来是[0,2200,2200]

现在,如果我在所需的数组中检查此数组,则这些值将不存在。因此,我将不对此做任何事情。

现在,如果您看到前三个是0,

[0,0,0] and next three are [200,200,0]

所以现在,如果我将其与所需数组进行比较,并且下一个数组与此匹配,则将其替换为200 因此,同样。

我也添加了offset列。

1 个答案:

答案 0 :(得分:0)

另一种方法是使用pandas.DataFrame.shift()函数。

此功能使您可以通过将值上移或下移移(n)来创建新列pF_n,该列是列predictedFeature的偏移量(移位)。 。然后,您可以使用df.iterrows()循环进行行比较,以从零行中获取上一个/下一个第三个值。然后,根据这些结果构建数组。

例如:

import pandas as pd

vals = ['2000', '2000', '0', '0', '2200',
        '2200', '2200', '2200', '2200', '0',
        '0','0', '0', '200', '200', '0', '200',
        '200', '200', '200', '100', '100', '160',
         '160', '100', '0', '100', '0']

df = pd.DataFrame({'pF': vals})

# Shift to get the third **previous** value.
df['pF-3'] = df['pF'].shift(3)
# Shift to get the third **following** value.
df['pF3'] = df['pF'].shift(-3)

# Add values surrounding 0 to a list.
results = [row.values.tolist() for _, row in df.iterrows() if row['pF'] == 0]

输出:

      pF  pF-3   pF3
0   2000   NaN     0
1   2000   NaN  2200
2      0   NaN  2200
3      0  2000  2200
4   2200  2000  2200
5   2200     0  2200
6   2200     0     0
7   2200  2200     0
8   2200  2200     0
9      0  2200     0
10     0  2200   200
11     0  2200   200
12     0     0     0
13   200     0   200
14   200     0   200
15     0     0   200
...  ...   ...   ...

围绕零的值的数组:

[[0.0, nan, 2200.0],
 [0.0, 2000.0, 2200.0],
 [0.0, 2200.0, 0.0],
 [0.0, 2200.0, 200.0],
 [0.0, 2200.0, 200.0],
 [0.0, 0.0, 0.0],
 [0.0, 0.0, 200.0],
 [0.0, 160.0, nan],
 [0.0, 100.0, nan]]

其中pF-3列是前三个值,而pF3列是后三个值。

我希望这会有所帮助。