繁体   English   中英

在 Pandas 中聚合具有多种数据类型的多列

[英]Aggregate Over Multiple Columns with Multiple Data Types in Pandas

我有一个数据框,使得前 n 列中的变量在例如 2 行中是相同的,我想聚合浮点类型的重命名列。 这是一个例子:

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

所以在这个数据框中,我想在每 2 行中找到Var5Var6的平均值。 预期的 output 如下:

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

鉴于相同特征的数据类型不一致,有没有办法做到这一点? 例如, Var3可以是nan和 float。

你可以试试:

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

Output:

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

详情

要获取具有功能的字典:

当列具有混合类型的值或值的所有类型都是字符串时,该列的dtypeobject ,因此您可以屏蔽列以获取“非dtype-object”列,并使用np.where将 function 的mean放在与 object 不同的列中, 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'}

按两行分组

您可以使用带有参数df.index//2groupby将 dataframe 每两行切片,然后将agg与之前创建的字典一起使用

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

df.groupby(df.index//2).agg(dc)

Pandas 1.1 支持 groupby 索引中的 Null 值:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM