Несколько групповых функций в зависимости от того, есть ли имена столбцов в DataFrame - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть два DataFrames.

Один суммирует данные Лондонской переписи в приходах.Существует два типа столбцов: те, которые можно суммировать, потому что они являются абсолютными числами, и столбцы, которые необходимо усреднить, потому что они являются процентами.

Я хочу сгруппировать данные переписи по районам.У меня есть в другом DataFrame список столбцов, которые имеют проценты и должны быть усреднены при группировании, остальные столбцы должны быть суммированы.

Что у меня есть до сих пор:

test = censusDF.groupby(['Borough'], as_index = False).agg({pc_cols_df:'mean',
                                                        i for i not in pc_cols_df : 'sum'
                                                       })
test

Что даетмне эту ошибку;

  File "<ipython-input-84-6a20dc571632>", line 2
  for i not in pc_cols_df : 'sum'
  ^
  SyntaxError: invalid syntax

Я также пытался:

test = censusDF.groupby(['Borough'], as_index = False).agg({pc_cols_df.values.tolist():'mean'})
test

И получить эту ошибку;

TypeError: unhashable type: 'list'

Пример имен столбцов, которые должны быть усреднены:

age=All ages: Population % by age
age=0 to 4: Population % by age
age=5 to 7: Population % by age
age=8 to 9: Population % by age
age=10 to 14: Population % by age
age=15: Population % by age

Пример кадра данных переписи:

id, Name,   Borough N of all usual residents,   distance to work=Work mainly at or from home: Population N by distance travelled to work,   distance to work=Other: Population N by distance travelled to work, Total distance to work (km),    Average distance to work (km),  age=All ages: Population % by age,  age=0 to 4: Population % by age,    age=5 to 7: Population % by age,    age=8 to 9: Population % by age,    age=10 to 14: Population % by age

E05000039,  Thames, BarkingDagenham,    10728,  315,    569,    44684.2,    13.8,   100,    12.9,   5.8,    3.4,    6.9
E05000040   Valence BarkingDagenham 9867    240 526 41897.9 13.2    100 9.8 4.7 2.8 7
E05000041   Village BarkingDagenham 10787   238 585 51537.5 14.7    100 9.7 4.3 2.6 6.8
E05000042   Whalebone   BarkingDagenham 10575   299 567 54068.4 14.1    100 8.9 4.3 2.6 6.5
E05000043   Brunswick Park  Barnet  16394   832 892 72028.8 11.7    100 6.4 3.6 2.6 6.6
E05000044   Burnt Oak   Barnet  18217   611 1226    68000.4 11.4    100 8.4 4.6 2.8 7.2
E05000045   Childs Hill Barnet  20049   1301    1300    69172.1 9.7 100 7   3.4 2.1 5.4
E05000046   Colindale   Barnet  17098   583 1145    65002   11.2    100 8.5 4.2 2.4 6
E05000047   Coppetts    Barnet  17250   936 1036    75344.7 11  100 7.3 3.7 2.1 5.4
E05000048   East Barnet Barnet  16137   776 863 79660   12.8    100 7.2 3.9 2.4 6
E05000049   East Finchley   Barnet  15989   883 946 72995.5 11.1    100 7.1 3.7 2   4.9
E05000050   Edgware Barnet  16728   999 887 69743.2 12.2    100 7.8 4.3 3   7
E05000051   Finchley Church End Barnet  15715   1272    842 62194.5 10.9    100 6.6 3.7 2.4 5.1
E05000052   Garden Suburb   Barnet  15929   1485    636 59431.5 10.4    100 7.5 3.7 2.4 5.7
E05000053   Golders Green   Barnet  18818   1155    986 53137.1 9.2 100 9.3 5.6 3.1 7.9
E05000054   Hale    Barnet  17437   967 980 76701.1 12.4    100 8.2 4.1 2.4 6.9
E05000055   Hendon  Barnet  18472   1099    1219    66641.3 10.5    100 8.1 3.7 2.2 5

1 Ответ

0 голосов
/ 12 декабря 2018

Вы столкнулись с синтаксической ошибкой, потому что не используете словарные выражения.И вы не можете указать i for i not in pc_cols_df : 'sum' и ожидать, что python будет знать, что вы ссылаетесь на столбцы в censusDF (или, по крайней мере, я предполагаю, что вы пытаетесь это сделать).

Измените pct_cols_df на список (в этом нет необходимостиэто будет фрейм данных) или, по крайней мере, измените его на серию имен столбцов, и тогда следующий код должен выполнить то, что вы хотите:

censusDF.groupby('Borough', as_index = False).agg({**{col: 'mean' 
for col in pc_cols_df}, **{col: 'sum' for col in [col for col in censusDF.columns if col not in pc_cols_df]}})

Я не знаю, какой Python вы используете, так словарьслияние может прерваться в зависимости от этого.

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