【问题标题】:Add n values from the both sides of a pandas data frame column values从 pandas 数据框列值的两侧添加 n 个值
【发布时间】:2021-01-25 13:39:24
【问题描述】:

我有一个这样的数据框,

df
col1    col2
  A       1
  B       3
  C       2
  D       5
  E       6
  F       8
  G       10

我想将 col2 的特定值的上一个和下一个 n 值相加,并将其存储到一个新列中,

所以,如果 n=2,那么数据框应该是这样的,

 col1    col2    col3
  A       1       6  (only below 2 values are there no upper values, so adding 3 numbers)
  B       3      11 (adding one prev, current and next two)
  C       2      17(adding all 4 values)
  D       5      24(same as above)
  E       6      31(same as above)
  F       8      29(adding two prev and next one as only one is present)
  G       10     24(adding with only prev two values)

当找不到前一个或后两个值时,添加任何可用的值。 我可以使用 for 循环来做到这一点,但是执行时间会很长,寻找一些 pandas 的快捷方式可以最有效地做到这一点。

【问题讨论】:

  • 请问获得 col3 值的公式是什么?我无法理解5, 11, 17, 24.... 的逻辑
  • @JoeFerndz , 5=1+3+2(因为只有 3 个值) 11=1+3+2+5 17=1+3+2+5+6 24=3+ 2+5+6+8
  • @Kallol 您能否为每列提供多个示例,包括它在第 3 列中开始减少的位置。此外,您还要仔细检查数字。 5 不等于第一个示例中的 1 + 3 + 2。
  • 6 = (1 + 3 个值 (1 + 3 + 2)) = 理解。 11 = 6 + 2 个值 (1 + 3)。不应该是 10 而不是 11。接下来的 17 = 11 + 2 个值 (1 + 3) = 不应该是 16?这是你想要做的吗?我猜这些数字混淆了,因为您从 5 开始,然后将第一行更改为 6。我的逻辑是否正确?
  • @DavidErickson 解释了逻辑,检查编辑过的

标签: python pandas dataframe rolling-sum


【解决方案1】:

您可以使用rolling 方法。

import pandas as pd
df = pd.read_json('{"col1":{"0":"A","1":"B","2":"C","3":"D","4":"E","5":"F","6":"G"},"col2":{"0":1,"1":3,"2":2,"3":5,"4":6,"5":8,"6":10}}')

df['col3'] = df['col2'].rolling(5, center=True, min_periods=0).sum()
col1    col2    col3
0   A   1   6.0
1   B   3   11.0
2   C   2   17.0
3   D   5   24.0
4   E   6   31.0
5   F   8   29.0
6   G   10  24.0

【讨论】:

  • 是的,我的解决方案应该是df['col3'] = (df['col2'].shift(2).fillna(0) + df['col2'].shift(1).fillna(0) + df['col2'] + df['col2'].shift(-1).fillna(0) + df['col2'].shift(-2).fillna(0)) ...这样好多了
  • 感谢您分享答案。我不明白。将尝试了解有关滚动的更多信息,以弄清楚这里发生了什么。
  • @Joe Ferndz, rolling(5) 采用前 4 个值加上当前行...但是,center=True 参数意味着中间值位于当前行...所以它会抢先2 个值、当前值和下 2 个值,使其成为理想的解决方案。
猜你喜欢
  • 1970-01-01
  • 2021-04-09
  • 2021-11-09
  • 1970-01-01
  • 2018-09-27
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多