次のコードは機能しません。
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]を得るためにどのように微調整する必要がありますか?実際のデータフレームは非常に大きいため、効率が重要です。
use pandas ベクトル化された文字列メソッド ;ドキュメントのように:
これらのメソッドは、欠損値/ NA値を自動的に除外します
.str.lower()
は最初の例です。
>>> df['x'].str.lower()
0 one
1 two
2 NaN
Name: x, dtype: object
可能な解決策:
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
しかし、効率についてはわかりません。
str.casefold
を使用して大文字と小文字を区別するV0.25からは、「ベクトル化された」文字列メソッドを使用することをお勧めします str.casefold
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
と同様)。
違いはユニコードで見られます。 python str.casefold
docs の例を使用して、
ケースフォールディングは小文字化に似ていますが、文字列内のすべてのケースの区別を削除することを目的としているため、より積極的です。たとえば、ドイツ語の小文字
'ß'
は"ss"
と同等です。すでに小文字なので、lower()
は'ß'
に対して何もしません。casefold()
は"ss"
に変換します。
lower
の出力を比較して、
s = pd.Series(["der Fluß"])
s.str.lower()
0 der fluß
dtype: object
対casefold
、
s.str.casefold()
0 der fluss
dtype: object
リスト内包表記を使用している可能性があります
import pandas as pd
import numpy as np
df=pd.DataFrame(['ONE','Two', np.nan],columns=['Name']})
df['Name'] = [str(i).lower() for i in df['Name']]
print(df)
これも試してみてください
df= df.applymap(lambda s:s.lower() if type(s) == str else s)
データフレーム列をコピーして、単純に適用します
df = data ['x'] newdf = df.str.lower()