我遇到了一个问题,当分类数据缺失值时,熊猫的GroupBy.apply
和GroupBy.aggregate
会给出不同形状的结果。 aggregate
保留所有“已知”类别,但apply
仅保留数据中存在的类别。
这是一个简化的例子:
import pandas as pd
import numpy as np
# `missing` has 'b' category but no data uses it.
missing = pd.Categorical(list('aaa'), categories=['a', 'b'])
dense = pd.Categorical(list('abc'))
values = np.arange(len(dense))
df = pd.DataFrame({'missing': missing, 'dense': dense, 'values': values})
grouped = df.groupby(['missing', 'dense'])
print grouped.mean()
print grouped.agg(np.mean)
print grouped.apply(lambda chunk: np.mean(chunk))
打印
values
missing dense
a a 0
b 1
c 2
b a NaN
b NaN
c NaN
values
missing dense
a a 0
b 1
c 2
b a NaN
b NaN
c NaN
values
missing dense
a a 0
b 1
c 2
请注意,最后一个数据框缺少NaN
行missing = b
。我理解为什么apply
可能会这样做(它选择不将一组充满NaN
的组传递给减少函数)。上面的代码段只是一个玩具示例:我实际上需要使用apply
来获得我想要的结果。
问题:使用apply
的最佳方式是什么,但创建的输出形状与aggregate
返回的输出形状相匹配?