parallel.for 处理同一个数据集_python处理数据集重复列

1eff1e759a329feed43ce9cd14ff103f.png

数据处理是数据分析前极为重要的一环。有这样一种说法,做数据分析工作,90%以上的精力是放在了数据处理上。可想而知,数据处理在数据分析以及机器学习、深度学习中重要价值。

数据处理过程,是数据质量的过程。如果数据质量不高,噪音数据过多,就会影响输出数据结果的价值,数据分析的结果决策的可用性大打折扣,机器学习算法准确性降低等。

元数据存在的情况较多,比如:空值、异常值等。一份完整的数据也许是通过多个不同的数据源进行合并获得。在由多个数据集合并为一份数据集的情况下,经常会遇到这样的一种场景,即多个数据集间存在相同的字段名。

大家可能会诧异,不就是字段名相同吗?这个需要特别注意吗!答案是肯定的。

为什么说答案是肯定的。如果我们进行两个数据集合并为一个数据集的情况,两个数据集的字段都不多,比如有20个,那人工比对后进行重命名,然后在合并数据集即可解决问题。这种情况是极为简单的一种场景。换句话说,如果我们需要进行20个数据集合并为1个数据集这样的工作,每个数据集的字段数量超过50个以上,需要进行重复列比对,可以想像这样的工作量有多大。

python的简洁强大之处在于,类似这样的场景可以通过一个参数快速进行解决。接下来,小编通过一个实际的例子,介绍如何使用python进行数据集重复列情况的处理。

Merge有一个使用的suffixes选项,用于指定附加到左右两个DataFrame对象的重叠列名上的字符串:

In [1]: import pandas as pd

In [2]: from pandas import Series,DataFrame

In [3]: left=DataFrame({'key1':['foo','foo','bar'],'key2':['one','two','one'],'1val':[1,2,3]})

In [4]: right=DataFrame({'key1':['foo','foo','bar','bar'],'key2':['one','two','one','two'],'1val':[4,5,6,7]})

In [5]: pd.merge(left,right,on='key1')

Out[5]:

key1 key2_x 1val_x key2_y 1val_y

0 foo one 1 one 4

1 foo one 1 two 5

2 foo two 2 one 4

3 foo two 2 two 5

4 bar one 3 one 6

5 bar one 3 two 7

In [6]: pd.merge(left,right,on='key1',suffixes=('_left','_right'))

Out[6]:

key1 key2_left 1val_left key2_right 1val_right

0 foo one 1 one 4

1 foo one 1 two 5

2 foo two 2 one 4

3 foo two 2 two 5

4 bar one 3 one 6

5 bar one 3 two 7

从结果中可以看到,使用suffixes参数进行重复列处理,可以清楚的识别该字段是来源于哪个数据集,从而在一个结果数据集中,清楚识别出来源数据集。大家感兴趣的可以亲自体验一下,若有疑问,随时欢迎留言!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用并行退火算法求解att48.tsp数据集的最优路径并绘制图形的Python代码: ```python import numpy as np import matplotlib.pyplot as plt from multiprocessing import Pool # 读取数据集 def read_data(file_name): with open(file_name, 'r') as f: lines = f.readlines()[6:-1] data = [] for line in lines: x, y = map(float, line.strip().split()[1:]) data.append([x, y]) return np.array(data) # 计算路径长度 def get_distance(route, dist_mat): dist = 0 for i in range(len(route) - 1): dist += dist_mat[route[i], route[i+1]] dist += dist_mat[route[-1], route[0]] return dist # 生成初始解 def generate_init_solution(num_cities): return np.random.permutation(num_cities) # 退火过程 def anneal(route, dist_mat, temp, cooling_rate): dist_cur = get_distance(route, dist_mat) while temp > 1: new_route = np.copy(route) i, j = np.random.randint(0, len(route), size=2) new_route[i], new_route[j] = new_route[j], new_route[i] dist_new = get_distance(new_route, dist_mat) if dist_new < dist_cur: route = np.copy(new_route) dist_cur = dist_new else: prob = np.exp(-(dist_new - dist_cur) / temp) if np.random.rand() < prob: route = np.copy(new_route) dist_cur = dist_new temp *= cooling_rate return route, dist_cur # 并行退火过程 def parallel_anneal(num_cities, dist_mat, temp, cooling_rate, num_processes): with Pool(num_processes) as pool: routes = [generate_init_solution(num_cities) for _ in range(num_processes)] results = [pool.apply_async(anneal, args=(route, dist_mat, temp, cooling_rate)) for route in routes] best_route = None best_dist = float('inf') for res in results: route, dist = res.get() if dist < best_dist: best_route = route best_dist = dist return best_route, best_dist # 绘制路径图 def plot_route(route, cities): plt.plot(cities[route, 0], cities[route, 1], 'o-') plt.plot(cities[route[0], 0], cities[route[0], 1], 'ro') plt.title('Total distance: {:.2f}'.format(get_distance(route, dist_mat))) plt.show() if __name__ == '__main__': # 读取数据集 cities = read_data('att48.tsp') # 计算距离矩阵 dist_mat = np.zeros((len(cities), len(cities))) for i in range(len(cities)): for j in range(i, len(cities)): dist = np.linalg.norm(cities[i] - cities[j]) dist_mat[i, j] = dist dist_mat[j, i] = dist # 参数设置 temp = 1e4 cooling_rate = 0.999 num_processes = 4 # 并行退火 best_route, best_dist = parallel_anneal(len(cities), dist_mat, temp, cooling_rate, num_processes) # 绘制路径图 plot_route(best_route, cities) ``` 该代码首先读取att48.tsp数据集,并计算距离矩阵。然后定义了生成初始解、计算路径长度、退火过程、并行退火过程和绘制路径图等函数。在并行退火过程中,使用了Python的多进程库Pool,将初始解分为多个子问题,并对每个子问题独立地运行模拟退火算法,最后将子问题的解合并为全局解。最后,调用plot_route函数绘制最优路径图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值