1. ホーム
  2. python

[解決済み] Pythonです。Pandasは文字列の長さに基づいて文字列データをフィルタリングする

2023-01-26 17:26:55

質問

文字列の長さが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)]

どのように解決するのですか?

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