清理并填写分类变量以进行数据科学分析

时间:2019-05-11 16:53:20

标签: python python-3.x pandas pandas-groupby sklearn-pandas

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

问题1:

我有三列相关的列,这些列包含错误的信息:

现在看起来像什么: Example Table

我希望它看起来像什么: Would like my table to look like this...

如果按位置名称分组,则有不同的location_id数字和与该名称关联的国家/地区。但是,这些差异都有明显的赢家/多数。我有一个200万个条目的数据集,而给定的location_id和location_country的模式表明,location_name势不可挡,指向一个答案(例如:clear_creek的示例为“ 300”和“ USA”)。

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

我一直在使用groupby,replace,duplicate,但是我认为最终我将需要创建一个可以执行此操作的函数,老实说,我不知道从哪里开始。 (对于我的编码天真,我事先表示歉意)我知道有一个解决方案,只需要指出正确的方向即可。

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

3 个答案:

答案 0 :(得分:1)

我们可以将.aggpd.Series.mode结合使用,并通过map将其投射回您的数据框:


const Topics = ({ match }) => (
  <div> 
    This is a topics
    <div>
    {data.map((item, id) => <div key={id}><Link to={{
      pathname: `${match.url}/${item._id}`,
      state: item
    }}>{item.name}</Link> </div>)}

    </div>
    <hr />
    <Route path={`${match.path}/:id`} component={Topic} />

  </div>
);

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)

答案 1 :(得分:0)

正如Erfan提到的那样,了解您对第一个问题的预期输出会很有帮助。

第二只大熊猫使用fillna方法。您可以使用此方法填充NaN值。例如,用“ UNKNOWN_LOCATION”填充值,您可以执行以下操作:

df.fillna('UNKNOWN_LOCATION')

查看第一个问题的可能解决方案:

df.groupby('location_name')[['location_id', 'location_country']].apply(lambda x: x.mode())

答案 2 :(得分:0)

您可以使用df.iat[]通过计算模式来使用transform

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