Skip to main content
 首页 » 编程设计

python之如何仅聚合混合 dtypes 数据框中的数字列

2025年05月04日14linjiqin

我有一个混合的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 

这很好,我知道这是期望的行为,因为其他 dtype 可能会在 np.median 期间引发异常,但我还想得到我的原始列 F 和值 foo,以及带有 2018-01-01

的 C

到目前为止,我已经使用自定义包装器解决了数字聚合函数的问题,例如如果我想对我的数据框进行 nanmean:

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)  

但它看起来很糟糕。 这样做的正确方法是什么?

请您参考如下方法:

通过使用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)