转换为空

时间:2018-07-13 21:23:26

标签: python pandas nan pandas-groupby

我本来要使用内置函数(即transformgroupby'等)对'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个值

2 个答案:

答案 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分钟