在pandas数据框中使用多行或多列值进行计算

1 投票
1 回答
989 浏览
提问于 2025-04-17 23:58

我之所以对Excel这么熟悉,是因为我可以很方便地处理一系列的数值,或者说数组,并用这些数值进行计算。

比如说,我有一个数组:[1, 2, 1, 5, 7, 10, 6, 20, 12, 7, 4]

我可能想要计算:

  1. 连续的上升或下降序列的数量,比如1到2就是1次上升,因为2比1大。

  2. 在5、7、10的情况下,我想把这个上升序列算作2次,(5到7)和(7到10)。

  3. 我还想计算那些实际参与了这个序列的数值范围,以及它们出现的位置,比如虽然(6到10)只有1次连续上升,但它很重要,因为这个变化是14(20-6)。在记录这个序列发生的时间时,我想记录数组的索引位置,或者可能与数字关联的日期。

在Excel中,我会把这个数组传给一个函数,然后说如果第一个元素大于第二个元素,就继续看第三个、第四个,以此类推,当我记录到值下降时,就把这些值相加。

或者如果我是在处理单元格,我可以说如果(当前单元格的值)是负数,就用.offset来加上前两个单元格的值。

不过,我不太确定如何用pandas从行或列中获取两个或更多的值,就像我用offset那样?

非常感谢,Josh。

更新 >> 感谢大家的更新,我会添加更多细节

  1. 基本上,每个产品都有一组数值,而我有多个产品,产品在一列中,与产品相关的多个数字表示价格。目前我的表格布局如下,但同一个产品可能会出现在多行,因为它在不同日期出售:

'

|product    | price |
| Product A |  1    |
| Product B |  2    |
| Product C |  1    |
| Product D |  5    |
| Product E |  7    |
| Product F |  10   |
| Product G |  6    |
| Product H |  20   |
| Product I |  12   |
| Product H |  7    |
| Product I |  4    | 
  1. 然后,和第一点一样,我想计算从前面提到的点中连续上升和下降序列的数量。对于前两点,从1到2就是+1,如下所示:

    |产品 | 价格 | | 产品A | 0 | | 产品B | 1 | | 产品C | -1 | | 产品D | 4 | | 产品E | 2 | | 产品F | 3 | | 产品G | -4 | | 产品H | 14 | | 产品I | -8 | | 产品H | -4 | | 产品I | -3 |

  2. 然后我想把这些变动放在列中,这样我就可以求和,看看某个特定产品移动了多少次。

_

|product    | price | down -3 |down -2 |down -1 |up/down 0 |up 1     | 
| Product A |  1    |    0    |   0    |   0    |    0     |   0     | 
| Product B |  2    |    0    |   0    |   0    |    0     |   1     | 
| Product C |  1    |    0    |   0    |   1    |    0     |   0     | 
| Product D |  5    |    0    |   0    |   0    |    0     |   0     | 
| Product E |  7    |    0    |   0    |   0    |    0     |   0     | 
| Product F |  10   |    0    |   0    |   0    |    0     |   0     | 
| Product G |  6    |    0    |   0    |   0    |    0     |   0     | 
| Product H |  20   |    0    |   0    |   0    |    0     |   0     | 
| Product I |  12   |    0    |   0    |   0    |    0     |   0     | 
| Product H |  7    |    0    |   0    |   0    |    0     |   0     | 
| Product I |  4    |    1    |   0    |   0    |    0     |   0     |

_

  1. 接下来,对于问题(2),我想计算连续上升或下降的次数,并以同样的格式展示 |连续1 | 连续2| 等等。

  2. 接下来,对于问题(3),我想查看连续上升的数值范围和日期。例如产品C、D和E(假设产品C、D和E的价格日期是2014-01-01、2014-01-02和2014-01-03。这些产品显示了3次连续上升,数值分别是1、5、7。所以我想展示。

_

|products |dates                    | values  |
|C, D, E  | 2014-01-01 to 2014-01-03| 1, 5, 7 |

总结

  • 我想看到产品价格的变化(同一产品可以在不同日期以不同价格出售),从一天到另一天。
  • 然后我想看到某个产品移动1点的次数,与同一产品移动20点的次数相比。我可能会发现一个模式:这个产品不常改变价格,但一旦改变就会跳得很高。或者我可以通过求和价格变化,看到某个产品的价格最常是先下降3点再上升3点,因此它是周期性的。
  • 最后,我想看到价格移动3点时的日期,以及价格变化时的数值(1、5、7)。

1 个回答

1

在[1]中,我们创建了一个叫做s的序列,里面有一些数字:[1, 2, 1, 5, 7, 10, 6, 20, 12, 7, 4]。

1: 增加的次数

In [3]: s.diff() > 0
Out[3]: 
0     False
1      True
2     False
3      True
4      True
5      True
6     False
7      True
8     False
9     False
10    False
dtype: bool

In [4]: (s.diff() > 0).sum()
Out[4]: 5

2: 减少的次数:

In [5]: (s.diff() < 0).sum()
Out[5]: 5

3a: 变化的大小:

In [6]: s.diff()
Out[6]: 
0    NaN
1      1
2     -1
3      4
4      2
5      3
6     -4
7     14
8     -8
9     -5
10    -3
dtype: float64

3b: 变化的位置:

这些变化的位置应该已经通过数据框(DataFrame)或序列(Series)的索引处理好了。

你应该提供一些具体的例子,说明你希望从这个序列中得到什么样的结果。如果你想逐行处理这些数据,可能需要先把数据框转置一下。

撰写回答