pandas 如何仅聚合混合dtypes Dataframe 中的数字列

lnlaulya  于 2023-05-15  发布在  其他
关注(0)|答案(3)|浏览(95)

我有一个混合pd.DataFrame

import pandas as pd
import numpy as np
df = pd.DataFrame({ 'A' : 1.,
                     'B' : pd.Timestamp('20130102'),
                     'C' : pd.Timestamp('20180101'),
                     'D' : np.random.rand(10),
                     'F' : 'foo' })

df
Out[12]: 
     A          B          C         D    F
0  1.0 2013-01-02 2018-01-01  0.592533  foo
1  1.0 2013-01-02 2018-01-01  0.819248  foo
2  1.0 2013-01-02 2018-01-01  0.298035  foo
3  1.0 2013-01-02 2018-01-01  0.330128  foo
4  1.0 2013-01-02 2018-01-01  0.371705  foo
5  1.0 2013-01-02 2018-01-01  0.541246  foo
6  1.0 2013-01-02 2018-01-01  0.976108  foo
7  1.0 2013-01-02 2018-01-01  0.423069  foo
8  1.0 2013-01-02 2018-01-01  0.863764  foo
9  1.0 2013-01-02 2018-01-01  0.037085  foo

我想聚合我的数字列,但也保留非数字的。如果我做一个gropuby,然后是agg。我得到:

df.groupby('B').agg(np.median)
Out[13]: 
              A         D
B                        
2013-01-02  1.0  0.482157

这很好,我知道这是期望的行为,因为其他数据类型可能在np.median期间引发异常,但我还希望获得值为foo的原始列F,以及值为2018-01-01C
到目前为止,我已经用一个自定义的 Package 器解决了我的数值聚合函数,例如。if I wanted to do a nanmean纳米mean均值over my dataframe Dataframe :

def my_nan_median(x):
    if isinstance(x.values[0], np.datetime64):
        return np.min(x) # let the first datetime pass! 
    elif isinstance(x.values[0], str):
        return x.values[0] # let the strings pass!
    else:
        return np.nanmedian(x)

但看起来很糟糕怎样做才是正确的呢?

dffbzjpn

dffbzjpn1#

使用select_dtypes

df.groupby(list(df.select_dtypes(exclude=[np.number]))).agg(np.median).reset_index()

或者类似这样的东西:

df1 = df.groupby('B',as_index=False).agg(np.median)
pd.concat([df1,df.drop_duplicates(['B']).drop(list(df1),1).reset_index(drop=True)],axis=1)
avkwfej4

avkwfej42#

如果'C','F'对于'B'的每个值都是相同的,那么你可以把它包含在groupby列中,就像这样:

df.groupby(['B','C','F']).agg(np.median).reset_index()

或者正如@BradSolomn所建议的:

df.groupby(['B','C','F'], as_index=False).agg(np.median)

输出:

B          C    F    A         D
0 2013-01-02 2018-01-01  foo  1.0  0.392723

如果没有,那么你需要聚合'C','F',例如从'C','F'中获取第一个值

df.groupby('B').agg({'D':np.median,'A':np.median,'C':'first','F':'last'}).reset_index() 

           B          C    F    A         D
0 2013-01-02 2018-01-01  foo  1.0  0.392723
wvyml7n5

wvyml7n53#

这对我来说很好。

numerics = [col for col in df.columns 
    if isinstance(df[col].loc[0], (int, float, complex)))]

df.groupby('grouping field')[numerics].agg([np.mean, np.median])

实际上,如果NaN中的第一个条目。我找到了一个更好的方法:使用df.select_dtypes

numeric_cols = list(df.select_dtypes(include=np.number).columns)

df.groupby('grouping_field')[numeric_cols].agg([np.mean,np.median])

相关问题