【问题标题】:Get the rolling sum of values of id from two different column?从两个不同的列中获取 id 值的滚动总和?
【发布时间】:2019-04-04 00:18:36
【问题描述】:

df:

id1     id2     value1    value2
-----------------------------------
a       b       10        5
c       a       5         10
b       c       0         0
c       d       2         1
d       a       10        20
a       c       5         10

从列 ['id1','id2'] 中获取与 id 'a' 关联的值的总和:

id1     id2     a.rolling(2).sum()
-----------------------------------
a       b       NaN
c       a       20
d       a       30
a       c       25

如何使用 df.groupby 函数从两个不同的列中获取 id 'a' 值的滚动总和?

我试过这个df.groupby(['id1','id2])['value1','value2'].transform(lambda x: x.rolling(2).sum()),但没用。

【问题讨论】:

  • 在您最初的df 中,所有组都是单行,这将有助于获得您的预期输出。请参阅here 了解如何设置好问题的格式。

标签: python pandas dataframe pandas-groupby data-manipulation


【解决方案1】:

这是一种方法

i = df.filter(like='id')
v = df.filter(like='va')

x, y = np.where(i == 'a')

df.iloc[x].assign(A=v.values[x, y]).assign(Roll=lambda d: d.A.rolling(2).sum())

  id1 id2  value1  value2   A  Roll
0   a   b      10       5  10   NaN
1   c   a       5      10  10  20.0
4   d   a      10      20  20  30.0
5   a   c       5      10   5  25.0

【讨论】:

  • 这是我需要的,但我忘记指定包含所有其他 id 值而无需手动分配它。例如,一列用于 id ‘a’ 的滚动总和,另一列用于 id ‘b’,依此类推。我该怎么做?
  • 'b' 所在的行可能是不同的行。我建议建立一个很好的例子来展示你所追求的并展示你希望它看起来像什么。这应该是一个新问题。
【解决方案2】:

filter 之后使用concat

df1=df.filter(like='1')
df2=df.filter(like='2')
df2.columns=df1.columns
s=pd.concat([df1,df2]).sort_index().groupby('id1').rolling(2).sum()
s=s.loc['a']
df.loc[s.index].assign(new=s)
Out[99]: 
  id1 id2  value1  value2   new
0   a   b      10       5   NaN
1   c   a       5      10  20.0
4   d   a      10      20  30.0
5   a   c       5      10  25.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2021-10-09
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多