如何根据数值所属区间合并两个Pandas DataFrame?
解决年龄与教育阶段区间匹配的问题
没问题,我来帮你搞定这个年龄匹配教育阶段的需求!这里有两种可行的方法,你可以根据自己的数据规模来选择:
方法一:使用apply遍历匹配(适合小数据集)
这种方法逻辑直观,容易理解,适合数据量不大的情况:
import pandas as pd # 初始化教育阶段数据 edu_data = [['school', 5, 18], ['college', 19, 23], ['grad-school', 24, 28]] edu = pd.DataFrame(edu_data, columns=['Education', 'Low-Age', 'High-Age']) # 初始化人员年龄数据 data = [['tom', 5], ['nick', 28], ['juli', 14], ['jack', 30]] df = pd.DataFrame(data, columns=['Name', 'Age']) # 定义匹配函数:根据年龄返回对应的教育阶段 def match_education(age): for _, row in edu.iterrows(): # 检查年龄是否落在当前教育阶段的区间内(包含两端) if row['Low-Age'] <= age <= row['High-Age']: return row['Education'] # 没有匹配到任何区间时返回空值 return pd.NA # 将函数应用到Age列,生成新的Education列 df['Education'] = df['Age'].apply(match_education) print(df)
运行后会得到你期望的输出:
Name Age Education 0 tom 5 school 1 nick 28 grad-school 2 juli 14 school 3 jack 30 <NA>
方法二:使用pd.cut区间划分(适合大数据集)
如果你的数据量很大,iterrows的遍历效率会比较低,这时用pd.cut会更高效:
import pandas as pd # 初始化数据 edu_data = [['school', 5, 18], ['college', 19, 23], ['grad-school', 24, 28]] edu = pd.DataFrame(edu_data, columns=['Education', 'Low-Age', 'High-Age']) data = [['tom', 5], ['nick', 28], ['juli', 14], ['jack', 30]] df = pd.DataFrame(data, columns=['Name', 'Age']) # 构建区间边界:确保包含最小年龄和超出最大年龄的情况 bins = [edu['Low-Age'].min() - 1] + edu['High-Age'].tolist() + [edu['High-Age'].max() + 1] # 对应的教育阶段标签 labels = edu['Education'].tolist() # 使用cut进行区间匹配,include_lowest=True确保左端点被包含 df['Education'] = pd.cut(df['Age'], bins=bins, labels=labels, include_lowest=True) print(df)
这个方法的输出和上面完全一致,但处理速度会快很多,尤其是当你有成千上万条数据的时候。
内容的提问来源于stack exchange,提问作者Denis
相关产品推荐
相关产品推荐

