如何基于另一Pandas DataFrame的值为现有DataFrame新建列
实现方案
核心思路是先提取第二个DataFrame中分类标识的首字母作为匹配键,再结合组内序号实现一一对应匹配,示例代码如下:
首先导入依赖:import pandas as pd
步骤1:构造示例数据(可替换为自己的真实数据)
# 第一个DataFrame,存储A/B/C重复3次的分类列 df1 = pd.DataFrame({ '分类': ['A','B','C','A','B','C','A','B','C'] # 其余原有列直接保留即可 }) # 第二个DataFrame,索引为A1/A2/A3/B1/B2/B3/C1/C2/C3格式,存储待匹配的数值 df2 = pd.DataFrame({ '待匹配数值': [10,20,30,40,50,60,70,80,90] }, index=['A1','A2','A3','B1','B2','B3','C1','C2','C3'])
步骤2:生成匹配用的辅助字段
# 提取df2索引的首字母作为匹配键 df2['匹配键'] = df2.index.str[0] # 给df1同分类下的行生成组内序号,匹配A1/A2/A3的后缀序号 df1['组内序号'] = df1.groupby('分类').cumcount() + 1 # 给df2同首字母下的行生成组内序号 df2['组内序号'] = df2.groupby('匹配键').cumcount() + 1
步骤3:关联匹配得到结果
df_result = pd.merge( df1, df2, left_on=['分类', '组内序号'], right_on=['匹配键', '组内序号'], how='left' # 删除临时生成的辅助字段 ).drop(columns=['匹配键', '组内序号'])
特殊场景调整
- 如果你不需要按顺序匹配,只要同字母的所有df2值都关联到对应字母的df1行上,删除组内序号的逻辑,仅用
分类和匹配键做关联即可,会自动生成笛卡尔积。 - 如果df2的A1/B1这类标识存在于普通列而非索引中,把
df2.index.str[0]替换为df2['你的标识列名'].str[0]即可。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

