所以我基本上有了一个Airbnb数据集,其中包含几列。其中几个对应于不同参数(清洁度,位置等)的等级。对于这些列,我有一堆要填充的NaN。
由于其中一些NaN对应于同一所有者的列表,因此我想用每个列的相应主机的平均评价水平填充某些NaN。
例如,假设对于主机X,review_scores_location的平均值为7。我想做的是,在review_scores_location列中,用7填充所有与主机X对应的NaN值。 / p>
我尝试了以下代码:
cols=['reviews_per_month','review_scores_rating','review_scores_accuracy','review_scores_cleanliness','review_scores_checkin','review_scores_communication','review_scores_location','review_scores_value']
for i in cols:
airbnb[i]=airbnb[i].fillna(airbnb.groupby('host_id')[i].mean())
尽管它可以运行并且不返回任何错误,但它不会填充NaN值,因为当我检查是否还存在NaN时,金额没有变化。
我在做什么?
感谢您抽出宝贵的时间阅读本文!
答案 0 :(得分:2)
这里的问题是,在airbnb.groupby('host_id')[i].mean()
中使用序列fillna
时,该函数尝试对齐索引,并且由于airbnb.groupby('host_id')[i].mean()
的索引实际上是列{{ 1}}而不是host_id
的原始索引值,airbnb
不能按预期工作。可以使用几种方法来完成这项工作,一种方法是在fillna
之后使用transform
,将每个组的groupby
值与原始索引值对齐,然后将{{1} }可以正常工作,例如:
mean
甚至,即使没有这样的循环,您也可以使用此方法:
fillna
以示例:
for i in cols:
airbnb[i]=airbnb[i].fillna(airbnb.groupby('host_id')[i].transform('mean'))
您会得到:
airbnb = airbnb.fillna(airbnb.groupby('host_id')[cols].transform('mean'))