尝试用fillna()和groupby()填充NaN

时间:2019-02-17 00:07:01

标签: python pandas group-by nan

所以我基本上有了一个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时,金额没有变化。

我在做什么?

感谢您抽出宝贵的时间阅读本文!

1 个答案:

答案 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'))