Python根据行值提取DataFrame行返回0行,求可行方案(禁用loc/iloc)
问题与解决方案
原始数据与需求
现有带表头col1、col2、col3、col4的DataFrame数据:
| col1 | col2 | col3 | col4 |
|---|---|---|---|
| nan | nan | fr | rt. |
| nan | MK1 | fg. | aa. |
| nan. | MA1 | fl. | f2 |
需求:提取包含MK1、MA1的行,并输出为以下格式:
MK1|fg|aa MA1|fl |f2
原代码的问题
- 引号错误:使用了中文全角引号
‘’,Python仅支持半角引号''/"",会导致匹配失败或语法错误。 - 逻辑错误:提取多个值时用
&&(Python中逻辑与是&),且逻辑矛盾——同一行不可能同时存在MK1和MA1,应该用逻辑或|,或者用isin批量匹配。 - 未处理脏数据:原始数据存在多余空格、末尾点号,直接提取无法得到预期输出格式。
解决方案
1. 提取目标行(不使用loc/iloc)
方法A:用isin批量匹配目标值
targets = ['MK1', 'MA1'] filtered_df = df[(df.isin(targets)).any(axis=1)]
方法B:用逻辑或连接单个匹配条件
filtered_df = df[((df.values == 'MK1').any(axis=1)) | ((df.values == 'MA1').any(axis=1))]
2. 清洗数据并格式化输出
提取到目标行后,处理单元格的空格和末尾点号,再按要求格式输出:
# 清洗每个单元格:去首尾空格、移除末尾点号 cleaned_data = filtered_df.applymap(lambda x: x.strip().rstrip('.') if isinstance(x, str) else x) # 按指定格式打印结果 for _, row in cleaned_data.iterrows(): print(f"{row['col2']}|{row['col3']}|{row['col4']}")
完整可运行代码
import pandas as pd import numpy as np # 构造原始DataFrame raw_data = { 'col1': [np.nan, np.nan, 'nan.'], 'col2': [np.nan, 'MK1 ', 'MA1'], 'col3': [' fr ', 'fg.', 'fl. '], 'col4': ['rt.', 'aa. ', 'f2'] } df = pd.DataFrame(raw_data) # 提取目标行 target_values = ['MK1', 'MA1'] filtered_df = df[(df.isin(target_values)).any(axis=1)] # 清洗并输出 cleaned_df = filtered_df.applymap(lambda x: x.strip().rstrip('.') if isinstance(x, str) else x) for _, row in cleaned_df.iterrows(): print(f"{row['col2']}|{row['col3']}|{row['col4']}")
执行后输出:
MK1|fg|aa MA1|fl|f2
内容的提问来源于stack exchange,提问作者buddingprogrammer
相关产品推荐
相关产品推荐

