Pandas Merge/Join问题:正则提取结果关联原DataFrame生成多行
解决方案
你需要把原DataFrame中第一条记录根据正则提取的3个结果拆分成3条,同时保留第二条记录,最终生成包含4条记录的新DataFrame。可以通过以下步骤实现:
- 用
str.extractall提取所有引号内的内容,该方法会返回带多级索引的结果(第一级是原DataFrame的索引,第二级是匹配项的序号) - 将提取结果与原DataFrame按索引合并,保留原数据的所有列
- 重置索引并整理列名,得到最终的结构
修改后的代码如下:
import pandas as pd # 原数据 data = [['Sql "syn-eu2-prd-edw-001 database windows net", "syndpeu2prdedw1", Query="SELECT ta FROM rdv_60_137.Account"', "x1"], ["b1", "x2"]] df = pd.DataFrame(data, columns=["Expression","Key"]) # 提取所有引号内的内容,生成多级索引的结果 extracted = df['Expression'].str.extractall(r'"(.*?)"') # 重命名提取的列,方便识别 extracted.columns = ['Extracted_Content'] # 合并原数据和提取结果,按原索引关联 result = pd.merge(df, extracted, left_index=True, right_index=True, how='left') # 重置索引,清理多余的索引层级 result = result.reset_index(drop=True) print(result)
运行后输出的结果会是:
Expression Key Extracted_Content 0 Sql "syn-eu2-prd-edw-001 database windows net", "syndpeu2prdedw1", ... x1 syn-eu2-prd-edw-001 database windows net 1 Sql "syn-eu2-prd-edw-001 database windows net", "syndpeu2prdedw1", ... x1 syndpeu2prdedw1 2 Sql "syn-eu2-prd-edw-001 database windows net", "syndpeu2prdedw1", ... x1 SELECT ta FROM rdv_60_137.Account 3 b1 x2 NaN
如果不需要第二条记录的NaN值(因为它没有匹配到引号内容),可以把合并的how='left'改成how='inner',这样只会保留有提取内容的记录,但根据你的需求是包含原数据集所有记录,所以用left更合适。
内容的提问来源于stack exchange,提问作者Harry Leboeuf
相关产品推荐
相关产品推荐

