我本来要使用内置函数(即transform
,groupby
'等)对'mean'
对象使用'sum
方法,但要保留{{1} }值。例如,
np.nan
收益
np.random.seed(0)
df = pd.DataFrame({'value':np.random.randint(0,100,8)},index = list('aabbccdd'))
df.iloc[[0,6]] = np.nan
df.groupby(level=0).transform('min')
但我想要
value
a 43.0
a 43.0
b 4.0
b 4.0
c 44.0
c 44.0
d 89.0
d 89.0
使用我自己的功能,例如 value
a np.nan
a np.nan
b 4.0
b 4.0
c 44.0
c 44.0
d np.nan
d np.nan
最终会起作用...但是我有数以百万计的小团体,其中lambda x: min(skipna=True)
和lambda
方法占据了上风。有什么建议吗?
是的,有一个类似的question,但请注意,在该问题中,OP希望包括numpy
个组,而我不想跳过这些组中的np.nan
个值>
答案 0 :(得分:1)
熊猫默认为NaN
友好型。因此,您将不得不恢复为NumPy:
import numpy as np
np.random.seed(0)
df = pd.DataFrame({'value':np.random.randint(0,100,8)}, index=list('aabbccdd'))
df.iloc[[0,6]] = np.nan
res = df.groupby(level=0).transform(lambda x: np.min(x.values))
print(res)
value
a NaN
a NaN
b 22.0
b 22.0
c 46.0
c 46.0
d NaN
d NaN
或者,照常使用'min'
,然后更新找到空值的位置:
res = df.groupby(level=0).transform('min')
res[df.groupby(level=0)['value'].transform(lambda x: x.isnull().any()).astype('bool')] = np.nan
答案 1 :(得分:0)
由于transform
函数中对numpy
函数的任何求助都会使代码运行缓慢,我的解决方法是简单地创建一个附加列来标记空值,并在其中使用transform
和布尔值transform
来解决问题:
#mark nulls
df.loc[:,'missValue'] = df.value.isnull()
#use min as usual
res = df.groupby(level=0).value.transform('min')
#mark resulting values as NAN if one of them is missing
res[(df.groupby(level=0).missValue.transform('mean') == .5)] = np.nan
上面的代码在不到一分钟的时间内运行,而jpp提出的代码在我的实际数据集的子集的一次迭代上运行了超过10分钟