web-dev-qa-db-ja.com

pandasデータフレーム文字列列に欠損値がある場合、小文字にする方法は?

次のコードは機能しません。

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]を得るためにどのように微調整する必要がありますか?実際のデータフレームは非常に大きいため、効率が重要です。

51
P.Escondido

use pandas ベクトル化された文字列メソッド ;ドキュメントのように:

これらのメソッドは、欠損値/ NA値を自動的に除外します

.str.lower()は最初の例です。

>>> df['x'].str.lower()
0    one
1    two
2    NaN
Name: x, dtype: object
120
behzad.nouri

可能な解決策:

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

しかし、効率についてはわかりません。

6

パンダ> = 0.25: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

Python:lower()vs. casefold()文字列のマッチングと小文字への変換 も参照してください。

2
cs95

リスト内包表記を使用している可能性があります

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)
1
deepesh

これも試してみてください

df= df.applymap(lambda s:s.lower() if type(s) == str else s)
1
Farid

データフレーム列をコピーして、単純に適用します

df = data ['x'] newdf = df.str.lower()

0
Ch HaXam