我正在尝试将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())
答案 0 :(得分:1)
在这种情况下,我们需要避免填充l
列中的值,因为它是您的目标列。
一种方法是使用assign重新分配l
列。
df['mean_l'] = (df.fillna('')
.assign(l=df.l)
.groupby(list('abcdefghijk'))['l']
.transform('mean'))