次のコードは機能しません。
import pandas as pd
import numpy as np
df=pd.DataFrame(['ONE','Two', np.nan],columns=['x'])
xLower = df["x"].map(lambda x: x.lower())
xLower = ['one'、 'two'、np.nan]を取得するには、どのように調整すればよいですか?実際のデータフレームは巨大であるため、効率は重要です。
次のコードは機能しません。
import pandas as pd
import numpy as np
df=pd.DataFrame(['ONE','Two', np.nan],columns=['x'])
xLower = df["x"].map(lambda x: x.lower())
xLower = ['one'、 'two'、np.nan]を取得するには、どのように調整すればよいですか?実際のデータフレームは巨大であるため、効率は重要です。
回答:
パンダのベクトル化された文字列メソッドを使用します; ドキュメントのように:
これらのメソッドは、欠落している/ NA値を自動的に除外します
.str.lower()
そこにある最初の例です。
>>> df['x'].str.lower()
0 one
1 two
2 NaN
Name: x, dtype: object
10000 loops, best of 3: 96.4 µs per loop
対10000 loops, best of 3: 125 µs per loop
列に文字列だけでなく数値も含まれている場合の別の可能な解決策は、を使用astype(str).str.lower()
するto_string(na_rep='')
ことです。そうでない場合、数値が文字列ではない場合、下げると次のようNaN
になります。
import pandas as pd
import numpy as np
df=pd.DataFrame(['ONE','Two', np.nan,2],columns=['x'])
xSecureLower = df['x'].to_string(na_rep='').lower()
xLower = df['x'].str.lower()
次に、次のようになります。
>>> xSecureLower
0 one
1 two
2
3 2
Name: x, dtype: object
ではなく
>>> xLower
0 one
1 two
2 NaN
3 NaN
Name: x, dtype: object
編集:
NaNを失いたくない場合は、マップを使用する方が良いでしょう(@ wojciech-walczakおよび@ cs95コメントから)次のようになります
xSecureLower = df['x'].map(lambda x: x.lower() if isinstance(x,str) else x)
考えられる解決策:
import pandas as pd
import numpy as np
df=pd.DataFrame(['ONE','Two', np.nan],columns=['x'])
xLower = df["x"].map(lambda x: x if type(x)!=str else x.lower())
print (xLower)
そして結果:
0 one
1 two
2 NaN
Name: x, dtype: object
しかし、効率についてはよくわかりません。
isinstance
に、オブジェクトのタイプをチェックするときに使用します。
str.casefold
v0.25以降、str.casefold
Unicodeデータを処理する場合は、「ベクトル化された」文字列メソッドを使用することをお勧めします(文字列またはUnicodeに関係なく機能します)。
s = pd.Series(['lower', 'CAPITALS', np.nan, 'SwApCaSe'])
s.str.casefold()
0 lower
1 capitals
2 NaN
3 swapcase
dtype: object
関連するGitHubの問題GH25405も参照してください。
casefold
より積極的なケースフォールディングの比較に役立ちます。また、NaNを適切に処理します(str.lower
同様に)。
違いはユニコードで見られます。Pythonstr.casefold
ドキュメントの例をとると、
大文字小文字の区別は小文字に似ていますが、文字列内のすべての大文字小文字の区別を削除することを目的としているため、より積極的です。たとえば、ドイツ語の小文字
'ß'
は"ss"
。と同等です。すでに小文字なのでlower()
、'ß'
;には何もしません。casefold()
に変換し"ss"
ます。
lower
forの出力を比較します。
s = pd.Series(["der Fluß"])
s.str.lower()
0 der fluß
dtype: object
対casefold
、
s.str.casefold()
0 der fluss
dtype: object
df['original_category'] = df['original_category'].apply(lambda x:x.lower())
適用機能を使用し、
Xlower = df['x'].apply(lambda x: x.upper()).head(10)
(Efficiency is important since the real data frame is huge.)
さらにいくつかの返信があるので、どれがあなたの答えの良い点であるかを明らかにするようにしてください。
str.casefold
より積極的なケース折りたたみ文字列の比較をお勧めします。この回答の詳細情報。