列の1つで正規表現を使用してデータフレームをきれいにフィルタリングしたいと思います。
不自然な例:
In [210]: foo = pd.DataFrame({'a' : [1,2,3,4], 'b' : ['hi', 'foo', 'fat', 'cat']})
In [211]: foo
Out[211]:
a b
0 1 hi
1 2 foo
2 3 fat
3 4 cat
行をフィルタリングしf
て、正規表現を使用して始まる行に絞り込みます。最初に行く:
In [213]: foo.b.str.match('f.*')
Out[213]:
0 []
1 ()
2 ()
3 []
それはそれほど有用ではありません。しかし、これは私のブールインデックスを取得します:
In [226]: foo.b.str.match('(f.*)').str.len() > 0
Out[226]:
0 False
1 True
2 True
3 False
Name: b
だから私はそれから私の制限をすることができました:
In [229]: foo[foo.b.str.match('(f.*)').str.len() > 0]
Out[229]:
a b
1 2 foo
2 3 fat
それは私が人工的にグループを正規表現に入れるようにします、そしておそらく行くのにきれいな方法ではないようです。これを行うより良い方法はありますか?
私見私
—
tumultous_rooster 2015年
foo[foo.b.str.match('(f.*)').str.len() > 0]
はかなり良い解決策だと思います!regexの汎用性が詰め込まれているため、startswithよりもカスタマイズ可能で便利です。
これは少し遅いかもしれませんが、パンダの新しいバージョンでは、問題は修正されています。ライン
—
Behzad Mehrtash
foo[foo.b.str.match('f.*')]
は私のためにパンダ0.24.2で動作します。
foo[foo.b.str.startswith("f")]
動作します。