Агрегировать по нескольким столбцам с несколькими типами данных в Pandas - PullRequest
0 голосов
/ 05 августа 2020

У меня есть такой фрейм данных, что переменные в первых n столбцах одинаковы, например, для 2 строк, и я хотел бы агрегировать по столбцам с переименованием, которые имеют тип float. Вот пример:

import pandas as pd
import numpy as np

data=[[1,2,np.nan,'string', 100, 200],[1,2,np.nan,'string',102,202],[1,2,5,0.5,1000,2000],[1,2,5,0.5,1002,2002]]


pd.DataFrame(data=data,columns=['Var1','Var2','Var3','Var4','Var5','Var6'])

   Var1  Var2  Var3    Var4  Var5  Var6
0     1     2   NaN  string   100   200
1     1     2   NaN  string   102   202
2     1     2   5.0     0.5  1000  2000
3     1     2   5.0     0.5  1002  2002

Итак, в этом фрейме данных я хотел бы найти среднее значение Var5 и Var6 для каждых 2 строк. Предполагаемый результат будет следующим:

   Var1  Var2  Var3    Var4  Var5  Var6
0     1     2   NaN  string   101   201
1     1     2   5.0     0.5  1001  2001

Есть ли способ сделать это, если типы данных одних и тех же функций несовместимы? Например, Var3 может быть nan и числом с плавающей точкой.

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Вы можете попробовать:

dc=dict(zip(df.columns,np.where(df.dtypes!='object','mean','first')))
df.groupby(df.index//2).agg(dc)

Вывод:

   Var1  Var2  Var3    Var4  Var5  Var6
0     1     2   NaN  string   101   201
1     1     2   5.0     0.5  1001  2001

Подробности :

Чтобы получить словарь с функциями:

Когда столбец имеет смешанные типы значений или все типы значений является строкой, dtype столбца - object, поэтому вы можете замаскировать столбцы, чтобы получить столбцы "не-dtype-object", а с помощью np.where поместите функцию mean в столбцы отличается от объекта и first от других:

df.dtypes
#Var1      int64
#Var2      int64
#Var3    float64
#Var4     object
#Var5      int64
#Var6      int64
dtype: object

np.where(df.dtypes!='object','mean','first')
#['mean' 'mean' 'mean' 'first' 'mean' 'mean']

dc=dict(zip(df.columns,np.where(df.dtypes!='object','mean','first')))
dc
#{'Var1': 'mean', 'Var2': 'mean', 'Var3': 'mean', 'Var4': 'first', 'Var5': 'mean', 'Var6': 'mean'}

Для группировки по двум строкам :

Вы можете использовать groupby с аргументом df.index//2 для разделите фрейм данных на каждые две строки, а после этого используйте agg со словарем, созданным до

df.index//2
#Int64Index([0, 0, 1, 1], dtype='int64')

df.groupby(df.index//2).agg(dc)
0 голосов
/ 06 августа 2020

Pandas 1.1 поддерживает значения NULL в индексах groupby:

columns = df.columns[:4].tolist()
df.groupby(columns, dropna=False, sort=False).agg("mean")

                                Var5    Var6
Var1    Var2    Var3    Var4        
1        2       NaN    string   101    201
                 5.0    0.5     1001    2001
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...