You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

代码说明

  1. 先构造输入数据集(实际场景可替换为外部数据读取逻辑);
  2. 先筛选出核心主键ETL_ID和所有包含-->的列;
  3. 遍历列,对含-->的数值列计算分割后的差值,符合条件的列直接删除;
  4. 逐行检查数值列,标记并删除分割后差值绝对值≤1的行;
  5. 输出最终处理后的DataFrame。

内容的提问来源于stack exchange,提问作者Anurag Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:35:21