如何使用groupby和rollingsum之后的值创建新列?

2024-09-28 21:06:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在现有的df中创建一个新列。新列的值是由groupby和滚动和的组合创建的。我该怎么做?你知道吗

我尝试了两种方法,都会导致NaN值或“插入列的索引与框架索引不兼容”

df=类似于:


    HomeTeam    FTHP
0   Bristol Rvs 0
1   Crewe           0
2   Hartlepool  3
3   Huddersfield    1

我试过:

(一)

df['new'] = df.groupby('HomeTeam')['FTHP'].rolling(4).sum()

(二)

df['new'] = df.groupby('HomeTeam').FTHP.apply(lambda x: x.rolling(4).mean())

(1)输出以下值,这些值是我想添加到新列中的值。你知道吗

HomeTeam        
Brighton     12      NaN
             36      NaN
             49      NaN
             72      2.0
             99      2.0

我正在尝试将这些值添加到相应HomeTeam旁边的新列中。导致前三个的NaN(因为它是滚动的(4)),并在之后拾取值,类似于:


    HomeTeam    FTHP      RollingMean
0   Bristol Rvs 0         NaN
1   Crewe           0         NaN
2   Hartlepool  3         NaN
3   Huddersfield    1         NaN

Tags: 方法框架dfnewnansumgroupbyrolling
1条回答
网友
1楼 · 发布于 2024-09-28 21:06:58

要确保与原始(非重复)索引对齐,请执行以下操作:

df.groupby('HomeTeam', as_index=False)['FTHP'].rolling(4).sum().reset_index(0, drop=True)

df

  HomeTeam  FTHP
A        a     0
B        b     1
C        b     2
D        a     3
E        b     4

使用as_index=False分组会添加一个^{}值作为第0级,将原始索引保留在第1级:

df.groupby('HomeTeam', as_index=False)['FTHP'].rolling(2).sum()
#0  A    NaN
#   D    3.0
#1  B    NaN
#   C    3.0
#   E    6.0
#Name: FTHP, dtype: float64

Drop level=0以确保与原始索引对齐。您的原始索引不应该重复,否则您将得到一个ValueError。你知道吗

相关问题 更多 >