Частичные суммы по сериям в пандах - PullRequest
0 голосов
/ 29 мая 2018

У меня есть DataFrame, который выглядит как

       A      B
0     1.2     1
1     1.2     6
2     1.2     4
3     2.3     2
4     2.3     5
5     1.2     7

, и я хотел бы получить частичные суммы для группы, которая имеет одинаковое значение A, но только если они рядом с каждымДругой.В этом случае я бы ожидал другого DataFrame, как в

0    1.2    11
3    2.3    7
5    1.2    7

. У меня такое чувство, что я могу использовать .groupby, но я могу управлять им, чтобы работать, не обращая внимания, если группы Aрядом друг с другом.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

itertools.groupby

Страдает от той же проблемы, выделенной @ user2285236

g = groupby(df.itertuples(index=False), key=lambda x: x.A)
pd.DataFrame(
    [[a, sum(t.B for t in b)] for a, b in g],
    columns=df.columns
)

     A   B
0  1.2  11
1  2.3   7
2  1.2   7
0 голосов
/ 29 мая 2018

Использование groupby помощником Series с совокупностью first и sum:

df = df.groupby(df.A.ne(df.A.shift()).cumsum(), as_index=False).agg({'A':'first','B':'sum'})
print (df)
     A   B
0  1.2  11
1  2.3   7
2  1.2   7

Деталь :

Сравните shift d столбец с ne (!=) и добавьте cumsum для последовательных групп Series:

print (df.A.ne(df.A.shift()).cumsum())
0    1
1    1
2    1
3    2
4    2
5    3
Name: A, dtype: int32

Спасибо @ user2285236 за комментарий:

Проверка на равенство может привести к нежелательным результатам, когда dtype равен float.np.isclose может быть лучшим вариантом здесь

df = df.groupby(np.cumsum(~np.isclose(df.A, df.A.shift())), as_index=False).agg({'A':'first','B':'sum'})
print (df)
     A   B
0  1.2  11
1  2.3   7
2  1.2   7

print (np.cumsum(~np.isclose(df.A, df.A.shift())))
[1 1 1 2 2 3]
...