【发布时间】:2013-11-25 02:02:34
【问题描述】:
我喜欢过滤掉字符串长度不等于10的数据。
如果我尝试过滤掉 A 列或 B 列的字符串长度不等于 10 的任何行,我尝试了这个。
df=pd.read_csv('filex.csv')
df.A=df.A.apply(lambda x: x if len(x)== 10 else np.nan)
df.B=df.B.apply(lambda x: x if len(x)== 10 else np.nan)
df=df.dropna(subset=['A','B'], how='any')
这运行缓慢,但正在运行。
但是,当A中的数据不是字符串而是数字(read_csv读取输入文件时解释为数字)时,有时会产生错误。
File "<stdin>", line 1, in <lambda>
TypeError: object of type 'float' has no len()
我相信应该有更高效和优雅的代码来代替这个。
根据下面的答案和cmets,我找到的最简单的解决方案是:
df=df[df.A.apply(lambda x: len(str(x))==10]
df=df[df.B.apply(lambda x: len(str(x))==10]
或
df=df[(df.A.apply(lambda x: len(str(x))==10) & (df.B.apply(lambda x: len(str(x))==10)]
或
df=df[(df.A.astype(str).str.len()==10) & (df.B.astype(str).str.len()==10)]
【问题讨论】:
标签: python string pandas csv filter