У меня смешанный 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()
- person Jan Zeiseweis   schedule 16.10.2017