我正在尝试对一些数据进行分类。为此,我检查数据的分布情况。然后,我根据每个值的出现次数进行拆分。到目前为止,我所使用的算法工作得很慢。我想提高速度。速度是非常重要的,因为我使用相同的结构处理许多不同的数据,而且数据有点大(140 k行)。
def RamsesIdCategory(data):
# handling Ramses Id:
print('Starting Ramses Id')
valueRamses = data['Ramses Trade Id'].unique()
countRamses = data['Ramses Trade Id'].value_counts()
for value in valueRamses:
if countRamses.get(value) < 2:
data['Ramses Trade Id'].loc[data['Ramses Trade Id'] == value] = 1
elif 2 <= countRamses.get(value) < 5:
data['Ramses Trade Id'].loc[data['Ramses Trade Id'] == value] = 2
elif 5 <= countRamses.get(value) < 10:
data['Ramses Trade Id'].loc[data['Ramses Trade Id'] == value] = 3
elif 10 <= countRamses.get(value) < 20:
data['Ramses Trade Id'].loc[data['Ramses Trade Id']== value] = 4
elif 20 <= countRamses.get(value) < 32:
data['Ramses Trade Id'].loc[data['Ramses Trade Id']== value] = 5
else:
data['Ramses Trade Id'].loc[data['Ramses Trade Id'] == value] = 6
print('finished Ramses Id')
return data编辑:我重新编写了我的代码,因为我知道循环对我的行进行了太多的迭代是有问题的。以下是新版本:
def RamsesIdCategory(data):
# handling Ramses Id:
print('Starting Ramses Id')
valueRamses= data['Ramses Trade Id'].value_counts()
for i in data.index:
if valueRamses.get(data.get_value(i,'Ramses Trade Id'))<2:
data.set_value(i,'Ramses Trade Id',1)
elif 2<=valueRamses.get(data.get_value(i,'Ramses Trade Id'))<5:
data.set_value(i, 'Ramses Trade Id', 2)
elif 5 <= valueRamses.get(data.get_value(i, 'Ramses Trade Id')) < 10:
data.set_value(i, 'Ramses Trade Id', 3)
elif 10<= valueRamses.get(data.get_value(i, 'Ramses Trade Id')) < 20:
data.set_value(i, 'Ramses Trade Id', 4)
elif 20 <= valueRamses.get(data.get_value(i, 'Ramses Trade Id')) < 32:
data.set_value(i, 'Ramses Trade Id', 5)
else:
data.set_value(i, 'Ramses Trade Id', 6)
return(data)我对整个数据集进行了一次迭代,并进行了一次选择和修改,而不是试图对每个不同的值对整个数据进行多次修改。它比50分钟快100倍,因为它在几秒钟内运行。
发布于 2017-03-15 15:04:30
代码可以使用apply进行很大程度的简化。但是首先,您需要一种更好的方法来测试您的值并为它们分配一个id:
def convert_count_to_id(count, limits=(2, 5, 10, 20, 32)):
for id, limit in enumerate(limits, 1):
if count < limit:
return id
return id + 1这相当于你的elifs链,但更难出错。
现在,您的功能可以变成:
def ramses_id_category(data):
serie_name = 'Ramses Trade Id'
value_ramses = data[serie_name].value_counts()
id_ramses = values_ramses.apply(convert_count_to_id)
data[serie_name] = data[serie_name].apply(id_ramses.get)请注意,我在最后删除了return data。由于您正在对参数进行适当的变异,因此不需要返回它,因为调用方将能够在调用此函数时看到它们持有的引用上的更改。
https://codereview.stackexchange.com/questions/157790
复制相似问题