簡體   English   中英

如果 pandas dataframe 字符串列缺少值,如何將其小寫?

[英]How to lowercase a pandas dataframe string column if it has missing values?

以下代碼不起作用。

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

另一個可能的解決方案,如果該列不僅有字符串而且還有數字,則使用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,那么使用 map 會更好,(來自 @wojciech-walczak 和 @cs95 評論)它看起來像這樣

xSecureLower = df['x'].map(lambda x: x.lower() if isinstance(x,str) else x)

你也可以試試這個

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

一個可能的解決方案:

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

雖然不確定效率。

Pandas >= 0.25:使用str.casefold刪除大小寫差異

從 v0.25 開始,如果您正在處理 unicode 數據,我建議使用“矢量化”字符串方法str.casefold (它適用於字符串或 unicodes):

s = pd.Series(['lower', 'CAPITALS', np.nan, 'SwApCaSe'])
s.str.casefold()

0       lower
1    capitals
2         NaN
3    swapcase
dtype: object

另請參閱相關的 GitHub 問題GH25405

casefold有助於進行更激進的 case-folding 比較。 它還可以優雅地處理 NaN(就像str.lower所做的那樣)。

但為什么這更好?

使用 unicode 可以看到差異。 python str.casefold文檔中的示例為例,

Casefolding 類似於小寫,但更具侵略性,因為它旨在消除字符串中的所有大小寫區別。 例如,德語小寫字母'ß'等效於"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

另請參閱Python:lower() 與 casefold() 中的字符串匹配和轉換為小寫

應用 lambda 函數

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

可能正在使用列表理解

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)

使用應用功能,

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

復制您的 Dataframe 列並簡單地應用

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

用空字符串替換缺失值和任何其他數據類型,並將所有字符串小寫:

df["x"] = df["x"].apply(lambda x: x.lower() if isinstance(x, str) else "")

將缺失值和除字符串以外的任何其他數據類型替換為 nan,並將所有字符串小寫:

df["x"] = df["x"].apply(lambda x: x.lower() if isinstance(x, str) else np.nan)

保持 nan 和除 string 之外的任何其他數據類型,並將所有字符串小寫:

df["x"] = df["x"].apply(lambda x: x.lower() if isinstance(x, str) else x)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM