Python Pandas:排序和分组,然后将第二列的两个连续行求和以获得第三列的特定值

Posted

技术标签:

【中文标题】Python Pandas:排序和分组,然后将第二列的两个连续行求和以获得第三列的特定值【英文标题】:Python Pandas: Sort and group by, then sum two consecutive rows of 2nd column for a specific value of a 3rd column 【发布时间】:2019-01-14 17:06:48 【问题描述】:

我有这个数据框:

    Group   Turn    Name
0   G1       1      Maria
1   G1       2      Sam
2   G1       2      Sara
3   G1       3      Maria
4   G1       4      Mark
5   G1       5      Maria

6   G2       2      Maria
7   G2       1      Ahmad

8   G3       1      Maria
9   G3       2      David

我想根据“组”列的值对我的数据进行分组,并根据他们的“转”进行排序。因此,对于每一组,轮流都进行了排序。

然后我想将每个组中名称为“Maria”的行和之后的一行的“Turn”列的值相加。如果 Maria 是该组中的最后一个回合,那么只有总和 轮到玛丽亚了。

So the result looks like this:
    Group       Name    Sum 
        G1      Maria    3
        G1      Maria    7
        G1      Maria    5
        G2      Maria    2
        G3      Maria    3

我尝试了 group by 和 apply 和 shift,但它们都没有给我想要的最终结果。

 df = df.groupby('group').apply(lambda x: x.sort_values('Turn'))

有人可以帮帮我吗?

【问题讨论】:

Maria 在每个组中只会出现一次吗? 能否请您发布您尝试过的代码?一个完整的代码开始? 好吧,您可能想要扩展该逻辑。你想如何处理同一组中的玛丽亚、大卫玛丽亚、大卫(我们是将所有 4 相加,还是仅在第一次或最后一次出现之后?)如果玛丽亚是最后一回合的人,会发生什么? 是的,好点。我要编辑问题 你说“and the row after”,其中 row 是单数。您实际上是指 Maria 之后该组中的 所有 行,还是正好是下一行(假设存在)? 【参考方案1】:

您可以将ffilllimit 一起使用

df=df.sort_values(['Group','Turn'])
df[df.Name.where(df.Name=='Maria').groupby(df['Group']).ffill(limit=1).eq('Maria')].set_index('Group').Turn.sum(level=0)
Out[272]: 
Group
G1    5
G2    3
G3    3
Name: Turn, dtype: int64

【讨论】:

我认为这行不通。如果您在测试 df 的底部添加额外的非 Maria 行,它仍将被视为 Maria,因为 limit=2。你是说limit = 1吗? @DSM 是的,应该是一个 :-) 固定 @Wen 我是否也可以在按“组”分组时在求和之前对组内的转弯进行排序? @UserYmY 是的,你可以 @wen 你能加入解决方案吗?【参考方案2】:

用途:

df.set_index(['Group','Name',(df['Name'] == 'Maria').cumsum().rename('Occurance')])\
  .sum(level=[0,2])\
  .reset_index()\
  .assign(name='Maria')\
  .drop('Occurance', axis=1)

输出:

  Group  Turn   name
0    G1     3  Maria
1    G1     7  Maria
2    G1     5  Maria
3    G2     3  Maria
4    G3     3  Maria

【讨论】:

我已经要求 OP 进行澄清,但问题的标题是“ 个连续的第二列行”,这表明 cummax 不起作用。跨度> @Scott 这给出了 TypeError: 'str' object is not callable if I remove the slasesh and connect them in a line @Scott,这不仅在玛丽亚之后得到一排。它在 Maria 之后对所有非 Maria 行求和。

以上是关于Python Pandas:排序和分组,然后将第二列的两个连续行求和以获得第三列的特定值的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:按两列分组,将第一列组中的第一个值相加

使用 Pandas Python 进行分组和排序

Pandas 中分组字符串的累积和

根据 Pandas 中的组大小对分组数据进行排序

Pandas:按两个参数分组并按第三个参数排序

使用条件和排名进行分组的 Python/Pandas 实现