根据另一列

时间:2018-03-25 08:18:47

标签: python-3.x pandas missing-data fillna

我正在尝试根据对另一列的过滤替换数据框中的缺失值,"国家"

>>> data.head()
   Country  Advanced skiers, freeriders   Snow parks 
0       Greece                           NaN          NaN
1  Switzerland                           5.0          5.0
2          USA                           NaN          NaN
3       Norway                           NaN          NaN
4       Norway                           3.0          4.0

显然,这只是一小段数据,但我希望将所有NaN值替换为每个功能的平均值。

我尝试按国家/地区对数据进行分组,然后计算每列的平均值。当我打印出结果数组时,它会提供预期的值。但是,当我将其放入.fillna()方法时,数据显示不变

我已经尝试过来自this similar post的@ DSM解决方案,但我不确定如何将其应用于多个列。

listOfRatings = ['Advanced skiers, freeriders', 'Snow parks']

print (data.groupby('Country')[listOfRatings].mean().fillna(0))
-> displays the expected results

data[listOfRatings] = data[listOfRatings].fillna(data.groupby('Country')[listOfRatings].mean().fillna(0))
-> appears to do nothing to the dataframe

假设这是完整的数据集,这就是我期望的结果。

   Country  Advanced skiers, freeriders   Snow parks 
0       Greece                           0.0          0.0
1  Switzerland                           5.0          5.0
2          USA                           0.0          0.0
3       Norway                           3.0          4.0
4       Norway                           3.0          4.0

任何人都可以解释我做错了什么,以及如何修复代码?

1 个答案:

答案 0 :(得分:2)

您可以使用transform返回新的DataFrame,其大小与原始的聚合值相同:

print (data.groupby('Country')[listOfRatings].transform('mean').fillna(0))
   Advanced skiers, freeriders  Snow parks
0                          0.0         0.0
1                          5.0         5.0
2                          0.0         0.0
3                          3.0         4.0
4                          3.0         4.0

#dynamic generate all columns names without Country
listOfRatings = data.columns.difference(['Country'])
df1 = data.groupby('Country')[listOfRatings].transform('mean').fillna(0)
data[listOfRatings] = data[listOfRatings].fillna(df1)
print (data)

print (data)

       Country  Advanced skiers, freeriders  Snow parks
0       Greece                          0.0         0.0
1  Switzerland                          5.0         5.0
2          USA                          0.0         0.0
3       Norway                          3.0         4.0
4       Norway                          3.0         4.0