Это возможно с пандами? - PullRequest
0 голосов
/ 20 июня 2018

У меня есть набор данных, который выглядит следующим образом:

Date        COL1    COL2    COL3
2017/01/01   123      A       N
2017/01/01   234      A       N
2017/01/01   567      A       Y
2017/01/01   111      B       N
2017/01/02   123      A       Y
2017/01/02   999      A       N
2017/01/02   333      A       Y
2017/01/02   444      B       N
2017/01/02   555      B       Y

Желаемый выход

Date        COL2  Count
2017/01/01   A      1
2017/01/01   B      1
2017/01/02   A      0
2017/01/02   B      1

Объяснение желаемого выхода:

Я хочу суммировать строки COL1, принадлежащие определенной группе в COL2, и суммировать только, если значение COL3 равно N, и вычитать, если COL3 равно Y.

(Это должна быть скользящая сумма, где текущий расчет основан на сумме предыдущей даты и сегодняшней даты)

Я придумал скрипт на python, который сначала создает карту, ключ - COL2, а значение - кортеж даты и COL1. Затем сценарий проходит по всему набору данных, и в процессе я добавляю текущую строку на карту, если ее нет на карте, если она на карте, я добавляю.
Затем я просто перебираю созданную карту и проверяю размер каждой записи, чтобы получить счетчик.

Однако я хотел бы узнать, как это сделать с помощью панд, я пытался использовать группирование по группам и агрегирование, но не смог получить правильный формат.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 20 июня 2018

Предполагая, что вы группируете по дате и по COL2, вот решение с одним вкладышем:

Создание кадра данных:

>>> import pandas as pd
>>> df = pd.DataFrame({'Date': ['2017/01/01', '2017/01/01', '2017/01/01', '2017/01/02', '2017/01/02', '2017/01/02'], 
                   'COL1': [123, 234, 135, 123, 135, 246], 
                   'COL2': ['A', 'A', 'B', 'A', 'B', 'B'], 
                   'COL3': ['N', 'N', 'Y', 'N', 'N', 'Y']})
>>> df
    Date        COL1    COL2    COL3
0   2017/01/01  123     A       N
1   2017/01/01  234     A       N
2   2017/01/01  135     B       Y
3   2017/01/02  123     A       N
4   2017/01/02  135     B       N
5   2017/01/02  246     B       Y

Один код лайнера:

>>> df.join(((df.COL3 == 'N')*2 - 1).rename('Count').to_frame()).groupby(['Date','COL2']).Count.sum().groupby(level=[1]).cumsum().reset_index()
        Date    COL2    Count
0   2017/01/01  A       2
1   2017/01/01  B       -1
2   2017/01/02  A       3
3   2017/01/02  B       -1

Пояснение:

Сначала я создал еще один столбец, выведя значение суммы из COL3, назвав его Count, затем приступил к выполнению группировки sum, чтобы получить сумму для каждой комбинации Date, COL2, затем наконец группа cumsum на уровне COL2, чтобы получить скользящий счет.

0 голосов
/ 20 июня 2018

Решением будет создание настраиваемого агрегатора в pandas после groupby для столбцов.

>> from pandas import DataFrame as df
>>> df_ = df({'col': [1, 1, 1, 2, 2, 2], 'a': ['A', 'A', 'B', 'A', 'B', 'B'], 'b': ['N', 'N', 'Y', 'Y', 'N', 'Y']})
>> df_
   a  b  col
0  A  N    1
1  A  N    1
2  B  Y    1
3  A  Y    2
4  B  N    2
5  B  Y    2
>> f = lambda a: list(a).count('N')-list(a).count('Y') # custom aggregation after grouping
>> agg_df = df_.groupby(['col', 'a']).agg({'b': f}).reset_index()
>> agg_df
   col  a  b
0    1  A  2
1    1  B -1
2    2  A -1
3    2  B  0

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...