Pandas按顺序分组连续值

8
我可以帮您进行翻译。这段文字是关于编程的,作者不确定如何称呼一个操作,并且无法在谷歌上搜索到相关信息,但是他想做的事情是:他有一个数据框。
df = pd.DataFrame({"name": ["A", "B", "B", "B", "A", "A", "B"], "value":[3, 1, 2, 0, 5, 2, 3]})
df
  name  value
0    A      3
1    B      1
2    B      2
3    B      0
4    A      5
5    A      2
6    B      3

我希望将其按照df.name进行分组,并在df.values上应用max函数,但仅当名称连续时。因此,我的期望结果如下:
df.groupby_sequence("name")["value"].agg(max)
  name  value
0    A      3
1    B      2
2    A      5
3    B      3

有什么线索可以做到这一点吗?

2个回答

16

使用 pandas,你可以通过 (df.name!=df.name.shift()).cumsum() 在名称从一行到另一行发生变化时进行分组,这将连续的相同名称放在一起:

>>> df.groupby((df.name!=df.name.shift()).cumsum()).max().reset_index(drop=True)
  name  value
0    A      3
1    B      2
2    A      5
3    B      3

2

虽然不是pandas的解决方案,但你可以使用itertools中的groupby函数:groupby

from operator import itemgetter

import pandas as pd
from itertools import groupby

df = pd.DataFrame({"name": ["A", "B", "B", "B", "A", "A", "B"], "value":[3, 1, 2, 0, 5, 2, 3]})

result = [max(group, key=itemgetter(1)) for k, group in groupby(zip(df.name, df.value), key=itemgetter(0))]

print(result)

输出

[('A', 3), ('B', 2), ('A', 5), ('B', 3)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接