根据以前的条目按组构建新列

Construct new column based on previous entry by group

我有以下数据框:

import pandas as pd
score = [2,5,1,7,8,3,8,9,10,1]
group = ["A", "A", "B", "C", "C", "B", "A", "D", "D", "C"]
df = pd.DataFrame([group, score]).T
df.columns = ['Group', 'Score']

给出:

      Group Score
0     A     2
1     A     5
2     B     1
3     C     7
4     C     8
5     B     3
6     A     8
7     D     9
8     D    10
9     C     1

我想构建一个新列,为给定组提供上一个条目。它还会删除没有先前条目的行。所以我的预期输出是这样的:

score = [5,8,3,8,10,1]
previous_score = [2, 7, 1, 5, 9, 8]
group = ["A", "C", "B", "A", "D", "C"]
df1 = pd.DataFrame([group, score, previous_score]).T
df1.columns = ['Group', 'Score', 'Previous Score']

给出:

  Group Score Previous Score
0     A     5              2
1     C     8              7
2     B     3              1
3     A     8              5
4     D    10              9
5     C     1              8

我可以根据组将数据帧分成单独的数据帧并使用 shift 然后将它们粘在一起。但是,此数据的顺序很重要。我也可以只循环遍历数据框并找到上一个条目,但这效率很低。同样,我认为这将涉及一些 groupby 工作,但我不知道如何在不循环的情况下完成它。

您可以使用 groupby.shift 获取每个组的每一行中前一行的分数。然后 dropna 删除 NaN:

df = df.assign(Previous_Score=df.groupby('Group')['Score'].shift()).dropna().reset_index(drop=True)

输出:

  Group Score Previous_Score
0     A     5              2
1     C     8              7
2     B     3              1
3     A     8              5
4     D    10              9
5     C     1              8