不足している値がある場合、パンダのデータフレーム文字列列を小文字にする方法は?


87

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

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]を取得するには、どのように調整すればよいですか?実際のデータフレームは巨大であるため、効率は重要です。


v0.25以降、str.casefoldより積極的なケース折りたたみ文字列の比較をお勧めします。この回答の詳細情報。
cs 9519年

回答:


189

パンダのベクトル化された文字列メソッドを使用します; ドキュメントのように:

これらのメソッドは、欠落している/ 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 loop10000 loops, best of 3: 125 µs per loop
EdChum

1
@EdChumは、3つの要素だけで驚くことではありません。しかし、たとえば100個の要素だけではそうではありません。
behzad.nouri 2014年

@ behzad.nouri df1 ['comment'] = df1 ['comment']。str.lower()を試しましたが、エラーKeyError: 'comment'everythimeが発生しました。チェックしました-exacltyという名前の列が同じです。エラーの原因は何ですか?
カティア

16

列に文字列だけでなく数値も含まれている場合の別の可能な解決策は、を使用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)

1
ありがとう!私はNaNを忘れ、私は答え修正
マイク・W

7

これも試すことができます、

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

1
type(s) == str代わりにisinstance(s, str)
cs 9519年

7

考えられる解決策:

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に、オブジェクトのタイプをチェックするときに使用します。
cs 9519年

6

パンダ> = 0.25:ケースの区別を削除する str.casefold

v0.25以降、str.casefoldUnicodeデータを処理する場合は、「ベクトル化された」文字列メソッドを使用することをお勧めします(文字列または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"ます。

lowerforの出力を比較します。

s = pd.Series(["der Fluß"])
s.str.lower()

0    der fluß
dtype: object

casefold

s.str.casefold()

0    der fluss
dtype: object

文字列照合と小文字への変換におけるPython:lower()とcasefold()も参照してください。


2

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

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)

2

ラムダ関数を適用する

df['original_category'] = df['original_category'].apply(lambda x:x.lower())

1

適用機能を使用し、

Xlower = df['x'].apply(lambda x: x.upper()).head(10) 

1
効率はユーザーにとって重要であり、(Efficiency is important since the real data frame is huge.)さらにいくつかの返信があるので、どれがあなたの答えの良い点であるかを明らかにするようにしてください。
デビッド・ガルシアBodego

0

データフレーム列をコピーして、適用するだけです

df=data['x']
newdf=df.str.lower()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.