#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. Я не рассчитал время, но цикл обычно является плохой идеей, когда дело доходит до фреймов данных, так что, вероятно, это лучше.