基于条件交换Pandas DataFrame两列单元格值(Python)
问题分析与解决方案
错误原因
你的代码出现KeyError: 'Price/sqft'是因为df.loc['Price','Price/sqft']用法错误:Pandas的loc遵循行索引在前、列索引在后的规则,你把列名'Price'当成行索引传入,但你的DataFrame行索引是默认数字序列,不存在名为'Price'的行,因此抛出KeyError。此外代码还有两个核心问题:
- 开头的
Price/sqft=''.join(map(str, PM))和Price=''.join(map(str, MT))无上下文(PM/MT未定义),属于无效代码,需删除。 - 仅靠
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会自动修正被调换的行:
| Price | Price/sqft | Location |
|---|---|---|
| 1m | 1000 | CA |
| 2m | 2000 | PA |
| 3m | 3000 | CA |
| 4m | 4000 | CA |
关键说明
- 条件判断的阈值可以根据实际数据调整(比如存在小面积低单价的情况时,需要优化
swap_condition逻辑)。 - 所有操作仅针对满足条件的行,避免误修改正常数据。
内容的提问来源于stack exchange,提问作者Kan
相关产品推荐
相关产品推荐

