Мне нужны функции агрегирования (mean, std, var, min, max и т. Д.), Которые работают с фреймом данных Pandas, могут вызываться из groupby (). Apply (), но не удаляет строки, если все их значения одинаковы .
Итак:
mean(['a','a'])
должно дать 'a'
.
mean(['a','b'])
должен дать NaN
.
Поведение панд (как и следовало ожидать) - отбрасывать нечисловые значения:
>>> df = pd.DataFrame({'c1': [1,2,3],
'c2': [1,1,1],
'c3': ['a','b','c'],
'c4': ['a','a','a'],
'cat': ['x','x','y']})
>>> df.mean()
c1 2.0
c2 1.0
Где мне нужно:
c1 2.0
c2 1.0
c3 NaN
c4 'a'
cat NaN
Мне также нужны эти функции для каждой группы. Поэтому я создал функцию, которая будет выводить строки, как указано выше, аналогично значению (), которое я затем смогу вызвать из groupby.apply ():
def str_reduce(df):
is_uniq = False
try:
is_uniq = df.unique().size == 1
except:
pass
return df[0] if is_uniq else np.NaN
Это работает аналогично значению, когда я применяю его напрямую:
>>> df[['c3','c4']].apply(str_reduce)
c3 NaN
c4 a
Однако теперь он дает неожиданный результат, когда я вызываю его вслед за групповым?
>>> df.groupby(['cat']).apply(str_reduce)
cat
x NaN
y NaN
Что я делаю не так? И / или есть ли лучший / более простой способ сделать это в Pandas?