首页 > 解决方案 > 清理和填充分类变量以进行数据科学分析

问题描述

我正在处理我的第一个机器学习问题,我正在努力清理我的数据集中的分类特征。我的目标是建立一个攀岩推荐系统。

问题1:

我有三列相关的列有错误信息:

现在的样子: 示例表

我希望它看起来像什么: 希望我的桌子看起来像这样......

如果您按位置名称进行分组,则有不同的 location_id 编号和与该名称相关联的国家/地区。但是,这些差异中的每一个都有明显的赢家/明显多数。我有一个包含 200 万个条目的数据集,并且 location_id 和 location_country 的模式给定 location_name 指向一个答案(例如:clear_creek 的“300”和“USA”)。

使用 pandas/python,我如何按 location_name 对我的数据集进行分组,根据该位置名称计算 location_id 和 location_country 的模式,然后用这些基于 location_name 的模式计算替换整个 id 和 country 列以清理我的数据?

我玩过 groupby、replace、duplicated,但我认为最终我需要创建一个可以做到这一点的函数,老实说,我不知道从哪里开始。(我提前为我的编码天真道歉)我知道必须有一个解决方案,我只需要指出正确的方向。

问题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)

标签: pythonpython-3.xpandaspandas-groupbysklearn-pandas

解决方案


我们可以.agg结合使用pd.Series.mode并将其转换回您的数据框map

m1 = df.groupby('location_name')['location_id'].agg(pd.Series.mode)
m2 = df.groupby('location_name')['location_country'].agg(pd.Series.mode)

df['location_id'] = df['location_name'].map(m1)
df['location_country'] = df['location_name'].map(m2)

print(df)
   index location_name  location_id location_country
0      1     kalaymous          100              GRC
1      2     kalaymous          100              GRC
2      3     kalaymous          100              GRC
3      4     kalaymous          100              GRC
4      5   clear_creek          300              USA
5      6   clear_creek          300              USA
6      7   clear_creek          300              USA
7      8   clear_creek          300              USA
8      9   clear_creek          300              USA

推荐阅读