如何用Python为DataFrame匹配另一DataFrame的区间并添加列?
问题
我有两个行数不同的DataFrame:
第一个DataFrame(df1):
name value 1000 | 1 633 | 2 1233 | 3 1333 | 1
第二个DataFrame(df2):
min max 500 | 999 1000 | 1499 1500 | 1999
期望将df2中匹配name值的min、max列添加到df1,得到如下结果:
name value min max 1000 | 1 | 1000 | 1499 633 | 2 | 500 | 999 1233 | 3 | 1000 | 1499 1333 | 1 | 1000 | 1499
请问如何用Python实现该需求?
解决方案
方法一:交叉连接+条件筛选
先将两个DataFrame做交叉连接,再筛选出name落在对应min和max区间内的行:
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({'name': [1000, 633, 1233, 1333], 'value': [1, 2, 3, 1]}) df2 = pd.DataFrame({'min': [500, 1000, 1500], 'max': [999, 1499, 1999]}) # 交叉连接两个DataFrame cross_df = df1.assign(key=1).merge(df2.assign(key=1), on='key').drop('key', axis=1) # 筛选符合区间条件的行 result = cross_df[cross_df['name'].between(cross_df['min'], cross_df['max'])] # 重置索引 result = result.reset_index(drop=True)
方法二:使用pd.cut进行区间映射
通过pd.cut将name值匹配到对应的区间,直接映射出min和max值,效率更高:
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({'name': [1000, 633, 1233, 1333], 'value': [1, 2, 3, 1]}) df2 = pd.DataFrame({'min': [500, 1000, 1500], 'max': [999, 1499, 1999]}) # 生成区间边界,包含所有可能的取值范围 bins = [df2['min'].min() - 1] + df2['max'].tolist() # 生成对应区间的(min, max)标签 labels = list(df2[['min', 'max']].itertuples(index=False, name=None)) # 对name列进行区间划分,并提取对应的min和max df1[['min', 'max']] = pd.cut(df1['name'], bins=bins, labels=labels, include_lowest=True) # 将结果转换为数值类型 df1[['min', 'max']] = df1[['min', 'max']].apply(pd.to_numeric)
两种方法最终都能得到你期望的结果,方法二更适合处理大数据量的场景。
内容的提问来源于stack exchange,提问作者Madhushika Niroshanee
相关产品推荐
相关产品推荐

