文字列の長さが 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)]
ベストアンサー1
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