数据科学分析中分类变量的清理与填充

2024-05-29 02:41:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

问题1:

我有三个相关的栏目有错误的信息:

现在的样子: Example Table

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

如果按位置名称分组,则有不同的位置标识号和与该名称关联的国家/地区。然而,每一个差异都有一个明显的胜利者/明显的多数。我有一个200万个条目的数据集,给定位置名称的位置id和位置国家的模式是压倒性的,指向一个答案(例如:clear\u creek的“300”和“USA”)。你知道吗

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

我已经玩过groupby,replace,duplicated,但是我认为最终我需要创建一个函数来完成这个任务,我真的不知道从哪里开始。(我为我的编码幼稚提前道歉)我知道必须有一个解决方案,我只需要被指向正确的方向。你知道吗

问题2:

另外,有人建议在我的位置\姓名类别(42012/200万)和位置\国家(46890/200万)列中填写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)

Tags: 数据名称iddataindex模式location国家
3条回答

我们可以将^{}^{}结合使用,并使用^{}将其转换回您的数据帧:

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

正如Erfan提到的,对第一个问题的预期结果有一个看法是很有帮助的。你知道吗

对于第二个,pandas有一个fillna方法。可以使用此方法填充NaN值。例如,要用“UNKNOWN\u LOCATION”填充值,可以执行以下操作:

df.fillna('UNKNOWN_LOCATION')

请参阅第一个问题的潜在解决方案:

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

您可以通过使用^{}计算模式来使用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

相关问题 更多 >

    热门问题