簡體   English   中英

在 Pandas 中解析 csv 文件時,如何從字符串中刪除多余的空格?

[英]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_csvsep參數中使用正則表達式。 所以類似下面的內容應該適用於這個問題。

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 不同,配額有問題。

https://towardsdatascience.com/dealing-with-extra-white-spaces-while-reading-csv-in-pandas-67b0c2b71e6a#9281

暫無
暫無

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

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