我正在处理我的第一个机器学习问题,并且正在努力清理数据集中的分类特征。我的目标是建立攀岩推荐系统。
问题1:
我有与错误信息有关的三列相关的列:
现在看起来像什么:
我希望它看起来像什么:
如果按位置名称分组,则有不同的location_id编号和与该名称关联的国家/地区。但是,每种差异都有明显的赢家/多数。我有一个200万个条目的数据集,给定location_id和location_country的模式GIVEN,location_name压倒性地指向一个答案(例如:clear_creek的“ 300”和“ USA”)。
使用pandas / python,如何将我的数据集按location_name分组,如何基于该位置名称计算location_id和location_country的模式,然后使用基于location_name的这些模式计算替换整个id和country列,以清理我的数据?
我玩过groupby,replace,replicated,但是我认为最终我将需要创建一个函数来执行此操作,老实说,我不知道从哪里开始。 (对于我的编码天真,我事先表示歉意)我知道有一个解决方案,只需要指出正确的方向即可。
问题2:
另外,有人建议在我的location_name类别(42,012 / 2百万)和location_country(46,890 / 2百万)列中填写NaN值吗?最好保持为未知值?我觉得根据频率填写这些功能将对我的数据集造成极大的影响。
data = {'index': [1,2,3,4,5,6,7,8,9],
'location_name': ['kalaymous', 'kalaymous', 'kalaymous', 'kalaymous',
'clear_creek', 'clear_creek', 'clear_creek',
'clear_creek', 'clear_creek'],
'location_id': [100,100,0,100,300,625,300,300,300],
'location_country': ['GRC', 'GRC', 'ESP', 'GRC', 'USA', 'IRE',
'USA', 'USA', 'USA']}
df = pd.DataFrame.from_dict(data)
***寻找它返回:
improved_data = {'index': [1,2,3,4,5,6,7,8,9],
'location_name': ['kalaymous', 'kalaymous', 'kalaymous', 'kalaymous',
'clear_creek', 'clear_creek', 'clear_creek',
'clear_creek', 'clear_creek'],
'location_id': [100,100,100,100,300,300,300,300,300],
'location_country': ['GRC', 'GRC', 'GRC', 'GRC', 'USA', 'USA',
'USA', 'USA', 'USA']}
new_df = pd.DataFrame.from_dict(improved_data)
最佳答案
您可以使用transform
通过计算模式来使用df.iat[]
:
df=(df[['location_name']].join(df.groupby('location_name').transform(lambda x: x.mode()
.iat[0])).reindex(df.columns,axis=1))
print(df)
index location_name location_id location_country
0 1 kalaymous 100 GRC
1 1 kalaymous 100 GRC
2 1 kalaymous 100 GRC
3 1 kalaymous 100 GRC
4 5 clear_creek 300 USA
5 5 clear_creek 300 USA
6 5 clear_creek 300 USA
7 5 clear_creek 300 USA
8 5 clear_creek 300 USA