在解析Pandas中的csv文件时,如何从字符串中删除额外的空格?

时间:2012-11-14 19:25:29

标签: python parsing 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?

8 个答案:

答案 0 :(得分:42)

您可以使用转换器:

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

答案 1 :(得分:23)

嗯,空白在你的数据中,所以你不能在不读取空格的情况下读入数据。但是,在您阅读之后,您可以通过执行此操作来删除空格,例如df["Make"] = df["Make"].map(str.strip)(其中df是您的数据框)。

答案 2 :(得分:19)

将参数skipinitialspace=True添加到read_table为我工作。

所以试试:

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

同样适用于pd.read_csv()

答案 3 :(得分:9)

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

我有一个内置的pandas功能,我用过: pd.core.strings.str_strip(df['Description'])
 其中df是您的数据框架。就我而言,我在一个行数约为120万的数据帧上使用它并且速度非常快。

答案 4 :(得分:5)

我不相信Pandas在发布此问题时支持此功能,但最直接的方法是在sep read_csv参数中使用正则表达式。因此,以下内容适用于此问题。

table = pd.read_table("data.csv", sep=' *, *')

答案 5 :(得分:2)

这是一个迭代每列并应用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

答案 6 :(得分: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

答案 7 :(得分:0)

read_table已被弃用,这是文档中显示的消息。

  

从0.24.0版开始不推荐使用。

     

请改用pandas.read_csv(),并在必要时传递sep ='\ t'。

因此,使用 read_csv ,您可以为sep参数传入一个正则表达式,您可以在其中将分隔符指定为<​​/ p>

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*;的分隔符。