如何仅聚合混合 dtypes 数据框中的数字列
Posted
技术标签:
【中文标题】如何仅聚合混合 dtypes 数据框中的数字列【英文标题】:how to aggregate only the numerical columns in a mixed dtypes dataframe 【发布时间】:2018-03-28 03:51:30 【问题描述】:我有一个混合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
这很好,我知道这是期望的行为,因为其他 dtypes 可能会在 np.median 期间引发异常,但我也想获得我的原始列 F
和值 foo
,以及 C
2018-01-01
到目前为止,我已经使用自定义包装器解决了我的数值聚合函数,例如如果我想对我的数据框做一个 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)
但它看起来很糟糕。 这样做的正确方法是什么?
【问题讨论】:
如何对所有列进行分组?df.groupby(['B', 'C', 'F']).agg(np.median).reset_index()
missing column after pandas groupby的可能重复
【参考方案1】:
通过使用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)
【讨论】:
【参考方案2】:如果 '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
【讨论】:
这里似乎是正确的解决方法,尽管我注意到这种行为在早期是explicitly changed。所以简短的回答是任何不支持聚合函数(中位数)的 dtype 都将被删除。此外,这里只有df.groupby(['B', 'C', 'F']).median()
可以工作,您可以指定as_index=False
而不是重置。
感谢这实际上非常接近我所需要的。但是,如果我有数千列,可以使用 agg 字典中的列表,例如.aggmy_numerical_columns_list: my_fun ?
@Liborio Wen的解决方案有。以上是关于如何仅聚合混合 dtypes 数据框中的数字列的主要内容,如果未能解决你的问题,请参考以下文章
如何在熊猫数据框中仅针对 dtype bool 列将 True 和 False 映射为“是”和“否”?
如何判断 pandas 数据框中的列是不是为 datetime 类型?如何判断一列是不是为数字?