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

基于条件交换Pandas DataFrame两列单元格值(Python)

问题分析与解决方案

错误原因

你的代码出现KeyError: 'Price/sqft'是因为df.loc['Price','Price/sqft']用法错误:Pandas的loc遵循行索引在前、列索引在后的规则,你把列名'Price'当成行索引传入,但你的DataFrame行索引是默认数字序列,不存在名为'Price'的行,因此抛出KeyError。此外代码还有两个核心问题:

  1. 开头的Price/sqft=''.join(map(str, PM))和Price=''.join(map(str, MT))无上下文(PM/MT未定义),属于无效代码,需删除。
  2. 仅靠pd.to_numeric的转换异常判断是否交换值,无法覆盖示例中第二行的情况(Price/sqft是合法数值,但确实和Price内容被调换)。

正确实现思路

根据需求,判断值是否被调换的核心逻辑是:正常情况下Price是带m的字符串(如1m),Price/sqft是四位左右的数值;当某行的Price数值部分(去掉m)远大于Price/sqft的数值时,说明两者内容被调换。以下是具体实现代码:

import pandas as pd

# 构建示例DataFrame
data = {
    'Price': ['1m', '2000m', '3m', '4m'],
    'Price/sqft': [1000, 2, 3000, 4000],
    'Location': ['CA', 'PA', 'CA', 'CA']
}
df = pd.DataFrame(data)

# 1. 提取Price列的数值部分(去掉m),转换为数值
df['Price_num'] = df['Price'].str.replace('m', '').astype(float)

# 2. 定义需要交换值的行的条件:Price/sqft过小,且Price的数值部分过大
swap_condition = (df['Price/sqft'] < 100) & (df['Price_num'] > 100)

# 3. 对满足条件的行,交换Price和Price/sqft的值
df.loc[swap_condition, 'Price'] = df.loc[swap_condition, 'Price/sqft'].astype(str) + 'm'
df.loc[swap_condition, 'Price/sqft'] = df.loc[swap_condition, 'Price_num']

# 4. 删除临时列,确保Price/sqft为数值格式
df = df.drop('Price_num', axis=1)
df['Price/sqft'] = pd.to_numeric(df['Price/sqft'])

print(df)

执行结果

运行后输出的DataFrame会自动修正被调换的行:

PricePrice/sqftLocation
1m1000CA
2m2000PA
3m3000CA
4m4000CA

关键说明

  • 条件判断的阈值可以根据实际数据调整(比如存在小面积低单价的情况时,需要优化swap_condition逻辑)。
  • 所有操作仅针对满足条件的行,避免误修改正常数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:35:20