我想过滤掉字符串长度不等于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)]
答案 0 :(得分:65)
import pandas as pd
df = pd.read_csv('filex.csv')
df['A'] = df['A'].astype('str')
df['B'] = df['B'].astype('str')
mask = (df['A'].str.len() == 10) & (df['B'].str.len() == 10)
df = df.loc[mask]
print(df)
应用于filex.csv:
A,B
123,abc
1234,abcd
1234567890,abcdefghij
上面的代码打印
A B
2 1234567890 abcdefghij
答案 1 :(得分:9)
一种更加Pythonic的方法,根据其他列的给定条件及其值过滤掉行:
假设df为:
data={"names":["Alice","Zac","Anna","O"],"cars":["Civic","BMW","Mitsubishi","Benz"],
"age":["1","4","2","0"]}
df=pd.DataFrame(data)
df:
age cars names
0 1 Civic Alice
1 4 BMW Zac
2 2 Mitsubishi Anna
3 0 Benz O
然后:
df[
df['names'].apply(lambda x: len(x)>1) &
df['cars'].apply(lambda x: "i" in x) &
df['age'].apply(lambda x: int(x)<2)
]
我们将:
age cars names
0 1 Civic Alice
在上面的条件中,我们首先查看字符串的长度,然后检查字符串中是否存在字母(&#34; i&#34;),最后,我们检查整数的值第一栏。
答案 2 :(得分:3)
我个人认为这种方法最简单:
df['column_name'] = df[df['column_name'].str.len()!=10]
答案 3 :(得分:1)
如果行中有数字,则它们将转换为浮点数。
从cvs导入后,将所有行转换为字符串。为了更好的性能,将lambda分成多个线程。
答案 4 :(得分:0)
从A列和B列中滤除长度10以外的值,这里我将lambda表达式传递给map()函数。 map()函数始终适用于系列对象。
df = df[df['A'].map(lambda x: len(str(x)) == 10)]
df = df[df['B'].map(lambda x: len(str(x)) == 10)]
答案 5 :(得分:0)
您可以使用 applymap 一次过滤您想要的所有列,然后使用 .all() 方法仅过滤两列都为 True 的行。
#The *mask* variable is a dataframe of booleans, giving you True or False for the selected condition
mask = df[['A','B']].applymap(lambda x: len(str(x)) == 10)
#Here you can just use the mask to filter your rows, using the method *.all()* to filter only rows that are all True, but you could also use the *.any()* method for other needs
df = df[mask.all(axis=1)]
答案 6 :(得分:-1)
您可以使用df.apply(len)
。它将为您提供结果