DataFrameGroupby Поведение функции Cumsum для разреженных столбцов - PullRequest
1 голос
/ 14 января 2020

Мне нужно объединить сгруппированные данные DataFrameGroupBy.cumsum Это демонстрирует различное поведение, когда: 1. Данные являются плотными 2. Данные являются разреженными 3. Данные являются разреженными и используют эти значения в функции применения Пример ниже:

import pandas as pd
df=pd.DataFrame([['Jack','Blue','R1'],
               ['Jack','Grey','R2'],
               ['Jill','Grey','R1'],
                ['Jill','Red','R2'],
                ['Sue','Blue','R2'],
                ['Max','Grey','R1'],
                ['Jill','Blue','R1']],
                columns=list("ABC"))
df=pd.get_dummies(df,columns=['B','C'])
df.groupby('A')[['B_Blue','B_Grey','B_Red','C_R1','C_R2']].cumsum()
  1. Вывод: (правильно)
   B_Blue   B_Grey  B_Red   C_R1    C_R2
0   1       0       0       1       0
1   1       1       0       1       1
2   0       1       0       1       0
3   0       1       1       1       1
4   1       0       0       0       1
5   0       1       0       1       0
6   1       1       1       2       1
Теперь, если я использую sparse = True в get_dummies:
df=pd.get_dummies(df,columns=['B','C'],sparse=True)
df.groupby('A')[['B_Blue','B_Grey','B_Red','C_R1','C_R2']].cumsum()

Выход - DataError:

DataError                                 Traceback (most recent call last)
<ipython-input-36-8322e59e5a95> in <module>
----> 1 df.groupby('A')[['B_Blue','B_Grey','B_Red','C_R1','C_R2']].cumsum()

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\groupby\groupby.py in cumsum(self, axis, *args, **kwargs)
   2157             return self.apply(lambda x: x.cumsum(axis=axis, **kwargs))
   2158 
-> 2159         return self._cython_transform("cumsum", **kwargs)
   2160 
   2161     @Substitution(name="groupby")

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\groupby\groupby.py in _cython_transform(self, how, numeric_only, **kwargs)
    866 
    867         if len(output) == 0:
--> 868             raise DataError("No numeric types to aggregate")
    869 
    870         return self._wrap_transformed_output(output, names)

DataError: No numeric types to aggregate
При использовании применить функцию:
df=pd.get_dummies(df,columns=['B','C'],sparse=True)
df.groupby('A').apply(lambda x: x[['B_Blue','B_Grey','B_Red','C_R1','C_R2']].cumsum())

Я снова получаю правильный вывод:

    B_Blue  B_Grey  B_Red   C_R1    C_R2
0   1       0       0       1       0
1   1       1       0       1       1
2   0       1       0       1       0
3   0       1       1       1       1
4   1       0       0       0       1
5   0       1       0       1       0
6   1       1       1       2       1

Может кто-нибудь объяснить, почему произошел сбой Case 2?

...