Панды групповые последовательные значения - PullRequest
0 голосов
/ 31 октября 2018

Я понятия не имею, как вызвать эту операцию, поэтому я не мог ничего гуглить, но вот что я пытаюсь сделать:

У меня есть этот фрейм данных:

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 и применить функцию max к df.values, но только если имена в последовательности. Итак, мой желаемый результат заключается в следующем:

df.groupby_sequence("name")["value"].agg(max)
  name  value
0    A      3
1    B      2
2    A      5
3    B      3

Любая подсказка, как это сделать?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Используя 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
0 голосов
/ 31 октября 2018

Не совсем решение для панд, но вы можете использовать groupby из itertools:

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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...