Python:Pandas根据字符串长度过滤字符串数据

not*_*las 42 python csv string filter pandas

我想过滤掉字符串长度不等于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')
Run Code Online (Sandbox Code Playgroud)

这工作缓慢,但工作正常.

但是,当A中的数据不是字符串而是数字(当read_csv读取输入文件时解释为数字)时,它有时会产生错误.

  File "<stdin>", line 1, in <lambda>
TypeError: object of type 'float' has no len()
Run Code Online (Sandbox Code Playgroud)

我相信应该有更有效和优雅的代码而不是这个.

unu*_*tbu 75

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)
Run Code Online (Sandbox Code Playgroud)

应用于filex.csv:

A,B
123,abc
1234,abcd
1234567890,abcdefghij
Run Code Online (Sandbox Code Playgroud)

上面的代码打印

            A           B
2  1234567890  abcdefghij
Run Code Online (Sandbox Code Playgroud)


Mah*_*chi 12

基于其他列及其值的给定条件过滤掉行的更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
Run Code Online (Sandbox Code Playgroud)

然后:

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)
  ]
Run Code Online (Sandbox Code Playgroud)

我们将有 :

  age   cars  names
0   1  Civic  Alice
Run Code Online (Sandbox Code Playgroud)

在上面的条件中,我们首先查看字符串的长度,然后检查字符串中是否存在字母("i"),最后,我们检查第一列中的整数值.


小智 7

我个人认为这种方式是最简单的:

df['column_name'] = df[df['column_name'].str.len()!=10]
Run Code Online (Sandbox Code Playgroud)


rac*_*hwa 6

您还可以使用query

df.query('A.str.len() == 10 & B.str.len() == 10')
Run Code Online (Sandbox Code Playgroud)