我正在处理我的第一个机器学习问题,并且正在努力清理数据集中的分类特征。我的目标是建立攀岩推荐系统。
问题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,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)
答案 0 :(得分:1)
我们可以将.agg
与pd.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