我有一个混合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-01
的C
到目前为止,我已经用一个自定义的 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)
但看起来很糟糕怎样做才是正确的呢?
3条答案
按热度按时间dffbzjpn1#
使用
select_dtypes
:或者类似这样的东西:
avkwfej42#
如果'C','F'对于'B'的每个值都是相同的,那么你可以把它包含在groupby列中,就像这样:
或者正如@BradSolomn所建议的:
输出:
如果没有,那么你需要聚合'C','F',例如从'C','F'中获取第一个值
wvyml7n53#
这对我来说很好。
实际上,如果NaN中的第一个条目。我找到了一个更好的方法:使用df.select_dtypes