Split-Apply-Combine для агрегирования строк в Pandas фрейме данных - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь запустить split-apply-Объединение на следующем pandas кадре данных. Я хочу показать для каждого уникального кода клиента количество строк, в которых значение col1 меньше или равно 0, и количество строк, в которых значение col1 больше 0.

Итак, эта таблица:

    cust_code   col1    col2
0   113231413   -10     2795.19 
1   113231413   20      1485.76 
2   113231413   25      6201.18 
3   113231413   -25     1502.40 
4   526242422   -23     6470.12 
5   526242422   0       14011.28    
6   414314134   0       12426.78    
7   414314134   26      12104.77

Становится:

           cust_code    count1 count2   
0          113231413      2      2      
1          526242422      2      0      
2          414314134      1      1

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

count = df.groupby('cust_code')['cust_code'].count()

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Для pandas> = 0,25 Попробуйте:

df.groupby('cust_code')['col1'].agg(count1=(lambda s: s.loc[s <= 0].count()), 
                                    count2=(lambda s: s.loc[s > 0].count())).reset_index()

   cust_code  count1  count2
0  113231413       2       2
1  414314134       1       1
2  526242422       2       0

Или для более старых pandas версия:

df1 = df.groupby('cust_code').agg(
          {'col1': [lambda s: s.loc[s <= 0].count(),
                    lambda s: s.loc[s > 0].count()]
          }
      ).reset_index()
df1.columns=['cust_code','count1','count2']
df1
   cust_code  count1  count2
0  113231413       2       2
1  414314134       1       1
2  526242422       2       0
0 голосов
/ 24 февраля 2020

Если важна производительность, никогда не фильтруйте по группам, потому что медленно, если много групп. Лучше создать новые столбцы, заполненные масками, преобразованными в целые числа и агрегировать sum:

df1 = (df.assign(col1=df['col1'].le(0).astype(int),
               col2=df['col1'].gt(0).astype(int))
        .groupby('cust_code',sort=False)[['col1','col2']]
        .sum())
print   (df)1
           col1  col2
cust_code            
113231413     2     2
526242422     2     0
414314134     1     1
...