我有一個 DataFrame,其中每個條目都是一個字串值,并且給定的條目可能包含連續的空格。例如:
import re
import pandas as pd
df = pd.DataFrame({'col1':['a--b','c d'], 'col2':['e f','g---h']})
print(df)
輸出print(df)(這是初始df):
col1 col2
0 a--b e f
1 c d g---h
我想在所有條目中用一個空格替換任何連續的空格df。所以在這個例子中,'c d'(有兩個連續的空格)應該替換為'c d',并且'e f'(有三個連續的空格)應該替換為'e f'。
方法 1:我得到了正確的結果df.replace,就像這樣
# Approach 1 - works fine
df = df.replace('\s ', ' ', regex = True)
print(df)
輸出print(df)(這是預期的正確結果):
col1 col2
0 a--b e f
1 c d g---h
方法2:但是,我TypeError: expected string or bytes-like object在使用時得到df.transform了,就像這樣
# Approach 2 - gives TypeError
df = df.transform(lambda s: re.sub('\s ', ' ', s))
print(df)
輸出:
...
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/re.py", line 210, in sub
return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or bytes-like object
方法3:ValueError: Transform function failed如果我這樣做,我就會得到
# Approach 3 - gives ValueError
df = df.transform(lambda s: ' '.join(s.split()))
print(df)
輸出:
...
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pandas/core/apply.py", line 227, in transform
raise ValueError("Transform function failed") from err
ValueError: Transform function failed
那么方法 2 和 3 哪里出錯了?詢問是因為在df.transform轉換 DataFrame 中的每個單元格方面似乎更強大,并且在我的專案中需要它來進行更復雜的轉換。謝謝!
uj5u.com熱心網友回復:
您需要DataFrame.applymap進行元素處理,因為這兩個函式都使用標量:
df = df.applymap(lambda s: re.sub('\s ', ' ', s))
print(df)
col1 col2
0 a--b e f
1 c d g---h
df = df.applymap(lambda s: ' '.join(s.split()))
print(df)
col1 col2
0 a--b e f
1 c d g---h
方法DataFrame.transform處理列之類Series的,所以它失敗了。
Series.str.split您可以使用和Series.str.join處理列 ( )重寫第二個解決方案Series:
def f(x):
#test - processing column
#print (x)
return x.str.split().str.join(' ')
df = df.transform(f)
print (df)
col1 col2
0 a--b e f
1 c d g---h
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/431708.html
下一篇:如何在Pandas中重新排串列格
