Как объединить итерации по каждому столбцу и groupBy в пандах? - PullRequest
0 голосов
/ 29 октября 2018

У меня есть датафрейм с ~ 100 столбцами. В R я смог заменить каждый фактор в столбцах 2-100 на среднее значение, связанное с этим фактором из столбца 1, используя следующий код:

tmp <- NULL
for (i in seq(2,100,1)) {
tmp[[i]] <- df %>% group_by(df[[i]]) %>% mutate(mean = mean(column1)) %>%
ungroup() 

Пример из более простого фрейма данных:

df1:    
Column1     Column2
10          dog 
11          dog 
9           dog 
1           cat 
2           cat 
3           cat

станет:

df2:
Column1    Column2
10         10
11         10
 9         10
 1          2
 2          2
 3          2

Мой вопрос: как это можно сделать в python? Я пытался использовать различные комбинации пакета dfply, но не могу заставить его успешно зацикливаться на каждом столбце, а затем выводить кадр данных, который имеет те же измерения, что и исходный кадр данных.
Спасибо, Кит.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Мне удалось решить мою проблему, объединив предложение об использовании «transform» из @Alex с некоторыми моими собственными уловками, следующим образом:

list = []
df1:    
Column1     Column2    Column3
10              dog     square
11              dog     square
 9              dog     square
 1              cat     circle
 2              cat     circle
 3              cat     circle

for i in range (1,2,1):
  tmp = df.groupby([df.iloc[:,i]])["Column1"].transform('mean')
  list.append(tmp)
dfnew = pd.DataFrame(list)
dfnew = np.transpose(dfnew)

Вывод должен быть:

dfnew:    
Column1     Column2    Column3
10              10          10
11              10          10
 9              10          10
 1               2           2
 2               2           2
 3               2           2
0 голосов
/ 29 октября 2018
In [19]: df
Out[19]:    Column1 Column2
         0       10     dog
         1       11     dog
         2        9     dog
         3        1     cat
         4        2     cat
         5        3     cat
In [20]: df['Column2'] = df.groupby('Column2')['Column1'].transform('mean')
In [21]: df
Out[21]:    Column1  Column2
         0       10       10
         1       11       10
         2        9       10
         3        1        2
         4        2        2
         5        3        2

Чтобы перебрать столбцы, вы можете сделать это:

for g in d:
    # Put your code here 
    print(g)

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