Есть ли способ сгруппировать по нескольким подмножествам одного столбца в фрейме данных Pandas без использования цикла?

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Есть ли умный способ избежать перебора моих подмножеств, чтобы создавать разные группировки в одном столбце? Это задается для того, чтобы позже помочь с параллелизмом.

 import pandas as pd
types = ['a','a','a','b','b','c','c','c','c','c','d']
values = [1,2,1,3,1,4,5,6,7,9,10]
day = [1,1,2,1,2,1,1,2,3,2]

df = pd.DataFrame(zip(types,values,day),columns=['t','v','d'])

type_subsets = [['a','b'],
               ['a'],
               ['b','c','d']]

for s in type_subsets:
  df_subset = df[df['t'].isin(s)]
  print(s)
  print(df_subset.groupby('d')['v'].sum())
 

В настоящее время у этого есть вывод, но мне было интересно, есть ли способ представить это в одном фрейме данных?

 ['a', 'b']
d
1    6
2    2
Name: v, dtype: int64
['a']
d
1    3
2    1
Name: v, dtype: int64
['b', 'c', 'd']
d
1    12
2    16
3     7
Name: v, dtype: int64
 

Ответ №1:

Вы можете сделать:

 pd.DataFrame(type_subsets).apply(
    lambda row:
    df[df.t.isin(row)].groupby('d')['v'].sum(),
    axis=1))
 

что даст вам:

 d     1     2    3
0   6.0   2.0  NaN
1   3.0   1.0  NaN
2  12.0  16.0  7.0
 

У вас были 6 и 2 в вашем первом выводе из цикла for: они находятся в первой строке здесь.
Ваш второй вывод, 3 amp; 1 , находится во второй строке.
Ваш последний вывод: 12 , 16 , 7 : моя последняя строка.

Итак, мы «представляем» одни и те же данные без for цикла.


Разбивка того, что происходит:

pd.DataFrame(type_subsets) есть ли:

    0     1     2
0  a     b  None
1  a  None  None
2  b     c     d
 

с apply(,axis=1) помощью этого мы применяем функцию к каждой строке. Чтобы избежать необходимости определять функцию отдельно, мы используем лямбда-функцию. lambda row: , поэтому вводом является каждая строка. Затем: df[df.t.isin(row)].groupby('d')['v'].sum() . Это та же операция, которую вы выполнили в цикле for .

Комментарии:

1. Надеюсь, это понятно, дайте мне знать, если есть неясные части.

2. Это понятно, но у меня еще не было возможности попробовать это, но это еще. Есть идеи, является ли это более / менее эффективным, чем метод цикла?

3. Я не рассчитал время, но цикл обычно является плохой идеей, когда дело доходит до фреймов данных, так что, вероятно, это лучше.