保持疑惑,并转化均值

时间:2018-07-09 22:17:33

标签: python pandas group-by

我正在尝试将dataframe分组,并将其中包含nan的值保留在dataframe中。因此,我使用fillna("")

然后,我使用数字列l,并希望使用组的均值。我遇到错误Could not convert "" to numeric。这样做是因为我的l列中有一些nan值。

理想情况下,在执行groupby之后,我想将现在的“”值转换回nan,以便完成.mean()的计算。

我要做的工作是先将要分组的列仅转到“”,执行.mean(),然后将其后的“”值返回到nan完成。有更好的方法吗?

import random
random.seed(100)

df = pd.DataFrame({
'a':[random.randint(0, 1) for x in range(1000)],
'b':[random.randint(0, 1) for x in range(1000)],
'c':[random.choice([0, 1, np.nan]) for x in range(1000)],
'd':[random.randint(0, 1) for x in range(1000)],
'e':[random.choice([0, 1, np.nan]) for x in range(1000)],
'f':[random.choice(['id', 'id2']) for x in range(1000)],
'g':[random.choice(['apple', 'orange', 'pear']) for x in range(1000)],
'h':[random.randint(0, 1) for x in range(1000)],
'i':[random.randint(0, 1) for x in range(1000)],
'j':[random.randint(0, 1) for x in range(1000)],
'k':[random.randint(0, 1) for x in range(1000)],
'l':[random.choice([1, 2, 34, 6, 36, 990, np.nan, np.nan, 6, 5, 3, 2, 1, 1, 1]) for x in range(1000)]
})


df['mean_l'] = df.fillna("").groupby(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'])['l'].transform(lambda x: x.mean())

1 个答案:

答案 0 :(得分:1)

在这种情况下,我们需要避免填充l列中的值,因为它是您的目标列。

一种方法是使用assign重新分配l列。

df['mean_l'] = (df.fillna('')
                  .assign(l=df.l)
                  .groupby(list('abcdefghijk'))['l']
                  .transform('mean'))