Pandas筛选特定货币值时返回全部索引问题求助
问题分析与解决
你遇到的两个函数都返回所有行索引,核心原因是字符串匹配不精准,大概率是CSV里的Currency值和你写的判断条件对不上,具体原因和解决方法如下:
常见问题点
- 字符串带空白:CSV里的Currency值可能有前导/尾随空格、制表符,比如实际是
' Swiss Franc '而不是'Swiss Franc',导致精确匹配失败。 - 大小写不统一:比如CSV里是
'swiss franc'或者'SWISS FRANC',和你写的大小写不一致,判断条件不触发。 - CSV读取错了:如果CSV实际用的不是纯逗号分隔(比如逗号前后带空格),你用
sep=','会把多列混在一起,导致Currency列的值全是乱的,自然所有行都不符合有效列表。
一步步排查解决
1. 先查看Currency列的真实内容
先打印部分数据,确认值的格式:
# 打印前10行的Currency值 print(df['Currency'].head(10)) # 查看所有唯一值,确认有哪些内容 print(df['Currency'].unique()) # 检查字符串长度,判断有没有隐藏空白 print(df['Currency'].apply(len).head(10))
2. 清理字符串空白
如果发现有空白字符,先把列清洗干净:
# 去除前后所有空白字符(空格、制表符、换行) df['Currency'] = df['Currency'].str.strip()
3. 解决大小写匹配问题
如果是大小写不一致,可以统一转成相同大小写再判断:
# 转成小写后匹配Swiss Franc ids_invalid_currency = df[df['Currency'].str.lower() == 'swiss franc'].index.tolist() # 第二个函数统一转大写后匹配有效列表 valid_names = ['USD', 'JKF', 'CAD'] sus_name = df[~df['Currency'].str.upper().isin([name.upper() for name in valid_names])]
4. 修正CSV读取方式
如果CSV分隔符不是纯逗号(比如逗号前后有空格),用下面的方式读取:
df = pd.read_csv('data/data.csv', sep='\s*,\s*', engine='python')
修正后的完整代码
import pandas as pd # 读取CSV,兼容分隔符前后带空格的情况 df = pd.read_csv('data/data.csv', sep='\s*,\s*', engine='python') # 清理Currency列的空白字符 df['Currency'] = df['Currency'].str.strip() def invalid_currency(df): # 统一小写后匹配,避免大小写问题 ids_invalid_currency = df[df['Currency'].str.lower() == 'swiss franc'].index.tolist() print(ids_invalid_currency) return ids_invalid_currency def invalid_currency_names(df): valid_names = ['USD', 'JKF', 'CAD'] # 统一转大写后判断是否在有效列表中 sus_name = df[~df['Currency'].str.upper().isin([name.upper() for name in valid_names])] ids_sus_name = sus_name.index.to_list() print("Currency with invalid values: {}".format(ids_sus_name)) return ids_sus_name output_1 = invalid_currency(df) out_2 = invalid_currency_names(df)
内容的提问来源于stack exchange,提问作者madgoat
相关产品推荐
相关产品推荐

