我喜欢筛选出字符串长度不等于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()
我相信应该有更加高效和优美的代码替代这段代码。
基于以下回答和评论,我找到了最简单的解决方案:
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)]
astype('str')
是关键点。在更改任何列数据类型之前,确保使用它。要检查数据框中的数据类型,可以使用print(df.dtypes)
。 - agfe2