[英]How can I remove extra whitespace from strings when parsing a csv file in Pandas?
我有以下名為“data.csv”的文件:
1997,Ford,E350
1997, Ford , E350
1997,Ford,E350,"Super, luxurious truck"
1997,Ford,E350,"Super ""luxurious"" truck"
1997,Ford,E350," Super luxurious truck "
"1997",Ford,E350
1997,Ford,E350
2000,Mercury,Cougar
我想把它解析成一個 Pandas DataFrame 以便 DataFrame 如下所示:
Year Make Model Description
0 1997 Ford E350 None
1 1997 Ford E350 None
2 1997 Ford E350 Super, luxurious truck
3 1997 Ford E350 Super "luxurious" truck
4 1997 Ford E350 Super luxurious truck
5 1997 Ford E350 None
6 1997 Ford E350 None
7 2000 Mercury Cougar None
我能做的最好的是:
pd.read_table("data.csv", sep=r',', names=["Year", "Make", "Model", "Description"])
這讓我:
Year Make Model Description
0 1997 Ford E350 None
1 1997 Ford E350 None
2 1997 Ford E350 Super, luxurious truck
3 1997 Ford E350 Super "luxurious" truck
4 1997 Ford E350 Super luxurious truck
5 1997 Ford E350 None
6 1997 Ford E350 None
7 2000 Mercury Cougar None
如何在沒有這些空格的情況下獲得 DataFrame?
你可以使用轉換器:
import pandas as pd
def strip(text):
try:
return text.strip()
except AttributeError:
return text
def make_int(text):
return int(text.strip('" '))
table = pd.read_table("data.csv", sep=r',',
names=["Year", "Make", "Model", "Description"],
converters = {'Description' : strip,
'Model' : strip,
'Make' : strip,
'Year' : make_int})
print(table)
產量
Year Make Model Description
0 1997 Ford E350 None
1 1997 Ford E350 None
2 1997 Ford E350 Super, luxurious truck
3 1997 Ford E350 Super "luxurious" truck
4 1997 Ford E350 Super luxurious truck
5 1997 Ford E350 None
6 1997 Ford E350 None
7 2000 Mercury Cougar None
嗯,空白在你的數據中,所以你不能在不讀取空格的情況下讀入數據。 但是,在你讀完之后,你可以通過這樣做df["Make"] = df["Make"].map(str.strip)
空白,例如, df["Make"] = df["Make"].map(str.strip)
(其中df
是你的數據幀)。
將參數skipinitialspace=True
添加到read_table
為我工作。
所以嘗試:
pd.read_table("data.csv",
sep=r',',
names=["Year", "Make", "Model", "Description"],
skipinitialspace=True)
同樣的事情在pd.read_csv()
。
我沒有足夠的聲譽留下評論,但如果你有NaN值,上面的答案表明使用map
函數和strip
將不起作用,因為strip只適用於chars而NaN是浮點數。
有一個內置的pandas函數來執行此操作,我使用了: pd.core.strings.str_strip(df['Description'])
其中df
是您的數據幀。 就我而言,我在大約120萬行的數據幀上使用它並且速度非常快。
我不相信Pandas在發布此問題時支持此功能,但最直接的方法是在read_csv
的sep
參數中使用正則表達式。 所以類似下面的內容應該適用於這個問題。
table = pd.read_table("data.csv", sep=' *, *')
這是一個迭代每列並應用pd.core.strings.str_strip
:
def df_strip(df):
df = df.copy()
for c in df.columns:
if df[c].dtype == np.object:
df[c] = pd.core.strings.str_strip(df[c])
df = df.rename(columns={c:c.strip()})
return df
str.strip()函數在Series上運行得非常好。 因此,我將包含空格的數據幀列轉換為系列,使用str.strip()函數剝離空白,然后將轉換后的列替換回數據幀。 下面是示例代碼。
import pandas as pd
data = pd.DataFrame({'values': [' ABC ', ' DEF', ' GHI ']})
new = pd.Series([])
new = data['values'].str.strip()
data['values'] = new
read_table是不推薦使用的 ,這是文檔中顯示的消息。
自版本0.24.0后棄用。
請改用pandas.read_csv() ,必要時傳遞sep ='\\ t'。
因此,使用read_csv,您可以為sep
參數傳遞正則表達式,您可以在其中指定分隔符
sep="\s*,\s*"
任意數量的空格,后跟一個分隔符,后跟任意數量的空格 ,這將確保所有前導和尾隨空格也被選為分隔符塊,這反過來會刪除數據任一側的空格。
正則表達式的詳細信息如下:
\s -> white-space
* -> any number (zero or many)
, -> no meaning, direct character match
因此,正則表達式\\s*,\\s*
代表white-space[any number] match a comma and white-space[any number]
。
如果您的分隔符是逗號以外的任何其他內容,
在上面的表達式中用您的分隔符替換。 例如: \\s*;\\s*
if ;
是你的分隔符。
對我來說最好的方法是
def read_csv_regex(data, date_columns=[]):
df = pd.read_csv(data, quotechar='"', parse_dates=date_columns)
# remove front and ending blank spaces
df = df.replace({"^\s*|\s*$":""}, regex=True)
# if there remained only empty string "", change to Nan
df = df.replace({"":np.nan})
return df
您不需要編寫轉換器函數並將其設置為每一列,它適用於頭和尾空間,現在與 regexp sep 不同,配額有問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.