62

我有以下名为“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?

4

9 回答 9

60

您可以使用转换器:

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
于 2012-11-14T19:35:40.043 回答
51

添加参数skipinitialspace=Trueread_table我工作。

所以试试:

pd.read_table("data.csv", 
              sep=r',', 
              names=["Year", "Make", "Model", "Description"], 
              skipinitialspace=True)

同样的事情在pd.read_csv().

于 2015-09-21T21:26:27.990 回答
31

好吧,空白在您的数据中,因此如果不读取空白就无法读取数据。但是,在您读完之后,您可以通过执行(例如,您的数据框在df["Make"] = df["Make"].map(str.strip)哪里)来去除空格df

于 2012-11-14T19:29:04.327 回答
13

我没有足够的声誉来发表评论,但是如果您有 NaN 值,上面建议使用该map函数的答案strip将不起作用,因为 strip 仅适用于字符,而 NaN 是浮点数。

我使用了一个内置的 pandas 函数来执行此操作: 你的数据框pd.core.strings.str_strip(df['Description'])
在哪里df。就我而言,我在一个大约 120 万行的数据帧上使用了它,而且速度非常快。

于 2015-09-15T14:58:36.993 回答
13

我不相信 Pandas 在发布这个问题时支持这一点,但最直接的方法是sepread_csv. 所以类似下面的东西应该适用于这个问题。

table = pd.read_table("data.csv", sep=' *, *')
于 2018-02-28T04:32:14.867 回答
5

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*如果;是你的分隔符。

于 2019-04-23T07:31:01.327 回答
4

这是一个遍历每一列并应用的函数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
于 2016-08-18T21:08:27.723 回答
2

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
于 2017-05-02T18:46:24.057 回答
1

对我来说最好的方法是

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

于 2021-10-19T21:59:44.500 回答