如何比较不同形状Pandas DataFrame的depth列并匹配label?
匹配两个DataFrame的深度值并添加对应标签
这是个很常见的Pandas数据关联场景,针对你的需求,我提供两种简单高效的解决方案:
方法一:使用merge()函数合并(推荐)
因为你的DataFrame a 中depth1是唯一值,每个值对应唯一的label,而b中的depth2有重复项,用merge()可以轻松完成左连接(保留b的所有行),并把对应label匹配过来:
import pandas as pd import numpy as np # 初始化你的两个DataFrame data = [[0.0, 0.5, 1.0, 1.5, 2.0, 2.5],['a','b','c','d','e','f']] data = np.matrix(data).T a = pd.DataFrame(data, columns=['depth1', 'label']) b = pd.DataFrame([0, 0.5, 0.5, 0.5, 0.5, 1.0, 1.5, 1.5, 1.5, 2.0, 2.0, 2.5], columns=['depth2']) # 统一数据类型(解决np.matrix转换后depth1为字符串的问题) a['depth1'] = a['depth1'].astype(float) b['depth2'] = b['depth2'].astype(float) # 执行左连接合并,匹配depth2和depth1 result = pd.merge(b, a, left_on='depth2', right_on='depth1', how='left') # 移除多余的depth1列,只保留需要的列 result = result.drop(columns='depth1') print(result)
运行后输出结果:
depth2 label 0 0.0 a 1 0.5 b 2 0.5 b 3 0.5 b 4 0.5 b 5 1.0 c 6 1.5 d 7 1.5 d 8 1.5 d 9 2.0 e 10 2.0 e 11 2.5 f
方法二:使用map()映射
先把a转换成{深度值: 标签}的字典,再用map()方法给b批量添加标签,适合不需要完整合并的场景:
import pandas as pd import numpy as np # 初始化DataFrame data = [[0.0, 0.5, 1.0, 1.5, 2.0, 2.5],['a','b','c','d','e','f']] data = np.matrix(data).T a = pd.DataFrame(data, columns=['depth1', 'label']) b = pd.DataFrame([0, 0.5, 0.5, 0.5, 0.5, 1.0, 1.5, 1.5, 1.5, 2.0, 2.0, 2.5], columns=['depth2']) # 统一数据类型 a['depth1'] = a['depth1'].astype(float) b['depth2'] = b['depth2'].astype(float) # 创建深度到标签的映射字典 depth_label_map = a.set_index('depth1')['label'].to_dict() # 给b添加label列 b['label'] = b['depth2'].map(depth_label_map) print(b)
关键注意点
- 一定要统一数据类型:因为你用
np.matrix(data).T转换后,a中的depth1会变成字符串类型,而b的depth2是数值类型,直接匹配会失败,所以必须先转成相同类型(比如都转成float)。 - 如果
a中存在重复的depth1值,merge()会保留所有匹配结果,而map()只会取最后一个对应的标签,你可以根据实际需求选择方法。
内容的提问来源于stack exchange,提问作者Eric Kim
相关产品推荐
相关产品推荐

