如何在Pandas中将含Fax的Phone字段内容移至Fax列并截断原字段?
解决Pandas TypeError: unhashable type: 'Series' 及数据迁移需求
错误根源
你用了df[df['Phone'].str.contains("Fax") == True, "Fax"]这种错误的索引写法——Pandas不允许直接用逗号分隔行条件和列名来索引DataFrame,布尔Series属于不可哈希类型,才会抛出这个报错。
正确实现方案
步骤1:生成有效掩码
先创建布尔掩码,标记Phone列包含"Fax"的行,同时处理None值避免报错:
mask = df['Phone'].str.contains('Fax', na=False)
na=False是关键,它会把Phone列的None值直接判定为False,防止str.contains返回NaN导致索引异常。
步骤2:迁移数据到Fax列
用.loc索引器精准定位行和列,完成赋值:
df.loc[mask, 'Fax'] = df.loc[mask, 'Phone']
步骤3:清空原Phone字段
把符合条件的Phone列值设为None:
df.loc[mask, 'Phone'] = None
完整可运行代码
import pandas as pd df = pd.DataFrame([ {'Phone': 'Fax(925) 482-1195', 'Fax': None}, {'Phone': 'Fax(406) 226-0317', 'Fax': None}, {'Phone': 'Fax+1 650-383-6305', 'Fax': None}, {'Phone': 'Phone(334) 585-1171', 'Fax': 'Fax(334) 585-1182'}, {'Phone': None, 'Fax': None}, {'Phone': 'Phone(334) 585-1171', 'Fax': 'Fax(334) 585-1176'}] ) # 生成掩码 mask = df['Phone'].str.contains('Fax', na=False) # 迁移Fax数据 df.loc[mask, 'Fax'] = df.loc[mask, 'Phone'] # 清空原Phone字段 df.loc[mask, 'Phone'] = None print(df)
最终输出
Phone Fax 0 None Fax(925) 482-1195 1 None Fax(406) 226-0317 2 None Fax+1 650-383-6305 3 Phone(334) 585-1171 Fax(334) 585-1182 4 None None 5 Phone(334) 585-1171 Fax(334) 585-1176
核心注意点
- Pandas中必须用
.loc(标签索引)或.iloc(位置索引)来同时定位行和列,不能用df[行条件, 列名]的语法。 - 处理含空值的字符串列时,一定要给
str.contains加上na参数,否则空值会导致掩码失效。
内容的提问来源于stack exchange,提问作者bellotto
相关产品推荐
相关产品推荐

