我正在尝试同时对多个列进行分组并填充多个列。我要附上一张有关数据外观以及遇到问题的代码的图片。这是我创建的示例数据,反映了该真实数据,因为它是机密的。
共有4列:名称,植物,长度和宽度。有3种不同类型的植物。最后三个中的每个都有缺失的数据。我的最终目标是创建一个模型来猜测哪些植物类型缺失。但是要做到这一点,我首先尝试将每个名称/植物组合的长度和宽度均值推算为它们的缺失值。
下面显示的是一个计算有效均值的示例,我无法将其插入以填充na值。
lengthmean = df.groupby(['name', 'plant']).length.mean()
print(lengthmean)
我得到的结果看起来像这样
name plant
Brian plant 3 2.500000
plant1 1.850000
plant2 2.450000
Jeff plant 3 4.100000
plant1 2.333333
plant2 2.100000
Justin plant 3 2.900000
plant1 1.900000
plant2 2.850000
Zach plant 3 1.750000
plant1 2.650000
plant2 3.300000
我还尝试一次做多列(在这种情况下,长度和宽度都可以,但是在我的真实数据中,这还不止于此)。以下是对我来说失败的代码。
df[['length','width']] = df.groupby(['name', 'plant'])['length','width']\
.transform(lambda x: x.fillna(x.mean()))
我收到此错误'ValueError: Length mismatch: Expected axis has 32 elements, new values have 40 elements'
我将不胜感激,谢谢!
答案 0 :(得分:0)
感谢您提供示例数据,确实有帮助!
该问题似乎是由于您的plant
列中包含NaNs
。当我在数据集上运行您的代码df[['length','width']] = df.groupby(['name', 'plant'])['length','width']\
.transform(lambda x: x.fillna(x.mean()))
时,确实收到了错误消息。
当我在plant
列中删除空值时,它可以正常工作:
df = df.dropna(subset=['plant'])
df_cleaned[['length','width']] = df_cleaned.groupby(['name', 'plant'])['length','width']\
.transform(lambda x: x.fillna(x.mean()))
如果要填充/删除/添加新的植物值/等,则需要弄清楚要使用空植物列的操作。
希望有帮助!