Python Pandas实现含'-->'的DataFrame列与行筛选方案
完整Python实现方案
输入DataFrame
ETL_ID Name Age City Salary Score Address 0 1 John 28 New York --> Jersy 2000 --> 2001 90 I-1 1 2 Alice 25 --> 27 Los Angeles 3500 85 J-2 2 3 Bob 30 --> 31 Chicago 4000 68 K-3 3 4 Alan 33 --> 33.5 Ohio 2500 92 --> 82 L-9 4 5 David 43 --> 42 D.C. 5501 --> 5500 88 D-1
期望输出DataFrame
ETL_ID Age City Score 0 1 28 New York --> Jersy 90 1 2 25 --> 27 Los Angeles 85 3 4 33 --> 33.5 Ohio 92 --> 82
需求说明
- 保留主键
ETL_ID; - 删除所有不含
-->的列(如Name、Address列); - 删除所有含
-->但分割后数值差绝对值≤1的数值列(如Salary列); - 删除所有数值列中分割后差值绝对值≤1的行(如索引2、4的行)。
修正后的完整代码
import pandas as pd # 构造输入DataFrame(若从外部读取可替换为pd.read_csv等) data = { 'ETL_ID': [1, 2, 3, 4, 5], 'Name': ['John', 'Alice', 'Bob', 'Alan', 'David'], 'Age': ['28', '25 --> 27', '30 --> 31', '33 --> 33.5', '43 --> 42'], 'City': ['New York --> Jersy', 'Los Angeles', 'Chicago', 'Ohio', 'D.C.'], 'Salary': ['2000 --> 2001', '3500', '4000', '2500', '5501 --> 5500'], 'Score': ['90', '85', '68', '92 --> 82', '88'], 'Address': ['I-1', 'J-2', 'K-3', 'L-9', 'D-1'] } df = pd.DataFrame(data) # 步骤1:筛选需保留的列(ETL_ID + 含-->的列) keep_cols = ['ETL_ID'] for col in df.columns: if col != 'ETL_ID' and df[col].str.contains('-->').any(): keep_cols.append(col) df = df[keep_cols] # 步骤2:删除含-->但数值差绝对值≤1的数值列 cols_to_drop = [] for col in df.columns: if col == 'ETL_ID': continue # 提取该列第一个含-->的值,判断是否为数值列 arrow_rows = df[col].str.contains('-->') if arrow_rows.any(): sample_val = df[col][arrow_rows].iloc[0] try: val1, val2 = sample_val.split('-->') val1 = float(val1.strip()) val2 = float(val2.strip()) if abs(val1 - val2) <= 1: cols_to_drop.append(col) except ValueError: # 非数值列(如City),跳过删除 continue df = df.drop(cols_to_drop, axis=1) # 步骤3:删除数值列中分割后差值绝对值≤1的行 rows_to_drop = [] for idx, row in df.iterrows(): for col in df.columns: if col == 'ETL_ID': continue val = str(row[col]) if '-->' in val: try: val1, val2 = val.split('-->') val1 = float(val1.strip()) val2 = float(val2.strip()) if abs(val1 - val2) <= 1: rows_to_drop.append(idx) break except ValueError: continue # 去重后删除目标行 df = df.drop(set(rows_to_drop)) print(df)
代码说明
- 先构造输入数据集(实际场景可替换为外部数据读取逻辑);
- 先筛选出核心主键
ETL_ID和所有包含-->的列; - 遍历列,对含
-->的数值列计算分割后的差值,符合条件的列直接删除; - 逐行检查数值列,标记并删除分割后差值绝对值≤1的行;
- 输出最终处理后的DataFrame。
内容的提问来源于stack exchange,提问作者Anurag Gupta
相关产品推荐
相关产品推荐

