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】:
您可以将ffill
与limit
一起使用
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:排序和分组,然后将第二列的两个连续行求和以获得第三列的特定值的主要内容,如果未能解决你的问题,请参考以下文章