Pythonic /有效的方法从每个Pandas数据帧单元中剥离空格,其中包含类似字符串的对象

dea*_*ode 32 python dataframe pandas

我正在将CSV文件读入DataFrame.我需要从所有类似字符串的单元格中删除空格,而在Python 2.7中保留其他单元格不变.

这是我正在做的事情:

def remove_whitespace( x ):
    if isinstance( x, basestring ):
        return x.strip()
    else:
        return x

my_data = my_data.applymap( remove_whitespace )
Run Code Online (Sandbox Code Playgroud)

Pandas有没有比这更好或更惯用的方法呢?

是否有更有效的方式(也许是通过列方式做事)?

我试过寻找一个明确的答案,但是关于这个主题的大多数问题似乎是如何从列名本身中去除空格,或者假设单元格都是字符串.

Ada*_*zyk 51

在寻找我可以使用的快速简约的代码片段时偶然发现了这个问题.不得不从上面的帖子中自己组装一个.也许有人会发现它很有用:

data_frame_trimmed = data_frame.apply(lambda x: x.str.strip() if x.dtype == "object" else x)
Run Code Online (Sandbox Code Playgroud)

  • 这完成了这项工作.如果你的标题有尾随空格,请从/sf/answers/1512527131/添加`.rename(columns = lambda x:x.strip())` (3认同)
  • 如果 Pandas 将一列标记为“对象”,则此方法对我来说失败了。Pandas 会将具有混合数据类型的列标记为“object”,这并不一定意味着该列中的每个元素都是“str”。 (3认同)
  • @MichaelSilverstein在许多情况下,您可以首先使用“errors='ignore”参数将所有列转换为数字(这会忽略任何具有在将其转换为数字时会导致错误的值的列):“df.apply(pd) .to_numeric,错误='忽略')`。然后您可以更安全地使用此代码片段来去除空格。 (2认同)

jak*_*vdp 34

您可以使用pandas的Series.str.strip()方法为每个类似字符串的列快速执行此操作:

>>> data = pd.DataFrame({'values': ['   ABC   ', '   DEF', '  GHI  ']})
>>> data
      values
0     ABC   
1        DEF
2      GHI  

>>> data['values'].str.strip()
0    ABC
1    DEF
2    GHI
Name: values, dtype: object
Run Code Online (Sandbox Code Playgroud)


Mic*_*ein 13

我们想:

  1. 将我们的函数应用于数据帧中的每个元素 - 使用applymap

  2. 使用type(x)==str(与x.dtype == 'object'),因为 Pandas 会将列标记为object混合数据类型的object列(一列可能包含int和/或str)。

  3. 维护每个元素的数据类型(我们不想将所有内容都转换为 astr然后去除空格)。

因此,我发现以下是最简单的:

df.applymap(lambda x: x.strip() if type(x)==str else x)


War*_*ser 7

调用时pandas.read_csv,可以使用匹配零个或多个空格,后跟逗号,零个或多个空格的正则表达式作为分隔符。

例如,这里是"data.csv"

In [19]: !cat data.csv
1.5, aaa,  bbb ,  ddd     , 10 ,  XXX   
2.5, eee, fff  ,       ggg, 20 ,     YYY
Run Code Online (Sandbox Code Playgroud)

(第一行以三个空格结束XXX,第二行以最后一个空格结束Y。)

以下使用pandas.read_csv()正则表达式' *, *'作为分隔符来读取文件。(使用正则表达式作为分隔符仅在的“ python”引擎中可用read_csv()。)

In [20]: import pandas as pd

In [21]: df = pd.read_csv('data.csv', header=None, delimiter=' *, *', engine='python')

In [22]: df
Out[22]: 
     0    1    2    3   4    5
0  1.5  aaa  bbb  ddd  10  XXX
1  2.5  eee  fff  ggg  20  YYY
Run Code Online (Sandbox Code Playgroud)

  • 这是非常接近的,但是用引号引起的输入值有问题,例如:“ a,b,c”,d它不能从我想存储在数据框单元格中的第一个字段中拉出空格'a ,b,c' (2认同)