如何在Python Pandas中提取含Name列值的对应Comment列内容
提取Pandas DataFrame中含对应Name的Comment内容
问题场景
现有一个包含Name、Status和若干Comment1至CommentN列的DataFrame,示例结构如下:
| Name | Status | Comment1 | Comment2 | Comment3 |
|---|---|---|---|---|
| Abby | Valid | Abby.aom | Cindy.bom | Lulu.com |
| Bob | Valid | Ed.com | Dan.bom | Bob.aom |
| Chris | Blocked | Herdon.aom | Chris.bom | Judy.com |
创建该DataFrame的代码:
import pandas as pd comments = { 'Name': ['Abby', 'Bob', 'Chris'], 'Status': ['Valid', 'Valid', 'Blocked'], 'Comment1': ['Abby.aom', 'Ed.com', 'Herdon.aom'], 'Comment2': ['Cindy.bom', 'Dan.bom', 'Chris.bom'], 'Comment3': ['Lulu.com', 'Bob.aom', 'Judy.com'] } df = pd.DataFrame(comments)
需要提取每行中包含对应Name值的Comment列内容,最终得到仅含Name和Result的结果表。
实现方法
方法一:逐行遍历匹配(简单直观)
先筛选出所有Comment列,再逐行检查每个Comment列的内容是否包含当前行的Name值,找到匹配项后返回:
# 筛选所有以Comment开头的列 comment_cols = [col for col in df.columns if col.startswith('Comment')] # 定义函数提取每行的匹配内容 def get_matching_comment(row): for col in comment_cols: if row['Name'] in row[col]: return row[col] return None # 无匹配时返回None # 生成结果表 result_df = df[['Name']].copy() result_df['Result'] = df.apply(get_matching_comment, axis=1) print(result_df)
方法二:重塑数据后匹配(适合大数据量)
如果数据量较大,apply效率偏低,可以用melt将Comment列转为行结构,再筛选匹配项:
# 筛选Comment列 comment_cols = [col for col in df.columns if col.startswith('Comment')] # 重塑数据,把所有Comment列转为行 melted_df = df.melt(id_vars=['Name'], value_vars=comment_cols, value_name='Result') # 筛选出Result包含对应Name的行 matched_df = melted_df[melted_df.apply(lambda x: x['Name'] in x['Result'], axis=1)] # 去重,确保每个Name只保留一条结果 result_df = matched_df[['Name', 'Result']].drop_duplicates(subset='Name') print(result_df)
最终结果
两种方法都会得到如下结果:
| Name | Result |
|---|---|
| Abby | Abby.aom |
| Bob | Bob.aom |
| Chris | Chris.bom |
内容的提问来源于stack exchange,提问作者Yeanlinggg
相关产品推荐
相关产品推荐

