在pandas数据框中使用多行或多列值进行计算
我之所以对Excel这么熟悉,是因为我可以很方便地处理一系列的数值,或者说数组,并用这些数值进行计算。
比如说,我有一个数组:[1, 2, 1, 5, 7, 10, 6, 20, 12, 7, 4]
我可能想要计算:
连续的上升或下降序列的数量,比如1到2就是1次上升,因为2比1大。
在5、7、10的情况下,我想把这个上升序列算作2次,(5到7)和(7到10)。
我还想计算那些实际参与了这个序列的数值范围,以及它们出现的位置,比如虽然(6到10)只有1次连续上升,但它很重要,因为这个变化是14(20-6)。在记录这个序列发生的时间时,我想记录数组的索引位置,或者可能与数字关联的日期。
在Excel中,我会把这个数组传给一个函数,然后说如果第一个元素大于第二个元素,就继续看第三个、第四个,以此类推,当我记录到值下降时,就把这些值相加。
或者如果我是在处理单元格,我可以说如果(当前单元格的值)是负数,就用.offset来加上前两个单元格的值。
不过,我不太确定如何用pandas从行或列中获取两个或更多的值,就像我用offset那样?
非常感谢,Josh。
更新 >> 感谢大家的更新,我会添加更多细节
基本上,每个产品都有一组数值,而我有多个产品,产品在一列中,与产品相关的多个数字表示价格。目前我的表格布局如下,但同一个产品可能会出现在多行,因为它在不同日期出售:
'
|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到2就是+1,如下所示:
|产品 | 价格 | | 产品A | 0 | | 产品B | 1 | | 产品C | -1 | | 产品D | 4 | | 产品E | 2 | | 产品F | 3 | | 产品G | -4 | | 产品H | 14 | | 产品I | -8 | | 产品H | -4 | | 产品I | -3 |
然后我想把这些变动放在列中,这样我就可以求和,看看某个特定产品移动了多少次。
_
|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 |
_
接下来,对于问题(2),我想计算连续上升或下降的次数,并以同样的格式展示 |连续1 | 连续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]中,我们创建了一个叫做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)的索引处理好了。
你应该提供一些具体的例子,说明你希望从这个序列中得到什么样的结果。如果你想逐行处理这些数据,可能需要先把数据框转置一下。