Python/高效的方法,从每个包含字符串对象的Pandas Dataframe 单元格中去除空白

ugmeyewa  于 2023-04-28  发布在  Python
关注(0)|答案(9)|浏览(357)

我正在将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 )

有没有一个更好的或更习惯的Pandas的方式来做到这一点?
有没有更有效的方法(也许是通过列方式来做事情)?
我试图寻找一个明确的答案,但是关于这个主题的大多数问题似乎都是如何从列名中去掉空格,或者假设单元格都是字符串。

gpnt7bae

gpnt7bae1#

在寻找我可以使用的快速和简约的片段时偶然发现了这个问题。不得不自己从上面的岗位上组装一个。也许有人会觉得有用:

data_frame_trimmed = data_frame.apply(lambda x: x.str.strip() if x.dtype == "object" else x)
huwehgph

huwehgph2#

你可以使用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
ut6juiuv

ut6juiuv3#

我们希望:
1.将我们的函数应用于 Dataframe 中的每个元素-使用applymap
1.使用type(x)==str(而不是x.dtype == 'object'),因为Pandas将为混合数据类型的列标记为objectobject列可能包含int和/或str)。
1.维护每个元素的数据类型(我们不想将所有元素转换为str,然后去掉空格)。
因此,我发现以下是最简单的:
df.applymap(lambda x: x.strip() if type(x)==str else x)

yftpprvb

yftpprvb4#

调用pandas.read_csv时,可以使用一个正则表达式,该表达式匹配零个或多个空格,后跟一个逗号,后面再跟零个或多个空格作为分隔符。
例如,"data.csv"

In [19]: !cat data.csv
1.5, aaa,  bbb ,  ddd     , 10 ,  XXX   
2.5, eee, fff  ,       ggg, 20 ,     YYY

(The第一行在XXX之后的三个空格处结束,而第二行在最后一个Y处结束。)
下面使用pandas.read_csv()读取文件,并使用正则表达式' *, *'作为分隔符。(使用正则表达式作为分隔符仅在read_csv()的“python”引擎中可用。)

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
ilmyapht

ilmyapht5#

数据['值']。str.strip()”上面答案对我不起作用,但我找到了一个简单的解决方法。我相信有更好的方法来做到这一点。str.strip()函数在Series上工作。因此,我将dataframe列转换为Series,去掉空白,将转换后的列替换回dataframe。下面是示例代码。

import pandas as pd
data = pd.DataFrame({'values': ['   ABC   ', '   DEF', '  GHI  ']})
print ('-----')
print (data)

data['values'].str.strip()
print ('-----')
print (data)

new = pd.Series([])
new = data['values'].str.strip()
data['values'] = new
print ('-----')
print (new)
ztigrdn8

ztigrdn86#

下面是一个使用pandas apply的列式解决方案:

import numpy as np

def strip_obj(col):
    if col.dtypes == object:
        return (col.astype(str)
                   .str.strip()
                   .replace({'nan': np.nan}))
    return col

df = df.apply(strip_obj, axis=0)

这将把对象类型列中的值转换为字符串。应谨慎使用混合类型的列。例如,如果您的列是邮政编码为20001和' 21110 ',则最终将显示为'20001'和'21110'。

fkaflof6

fkaflof67#

这对我很有效-将其应用于整个 Dataframe :

def panda_strip(x):
    r =[]
    for y in x:
        if isinstance(y, str):
            y = y.strip()

        r.append(y)
    return pd.Series(r)

df = df.apply(lambda x: panda_strip(x))
0x6upsns

0x6upsns8#

我发现下面的代码很有用,可能会帮助其他人。此代码段将允许您根据您的用例删除列以及整个DataFrame中的空格。

import pandas as pd

def remove_whitespace(x):
    try:
        # remove spaces inside and outside of string
        x = "".join(x.split())

    except:
        pass
    return x

# Apply remove_whitespace to column only
df.orderId = df.orderId.apply(remove_whitespace)
print(df)

# Apply to remove_whitespace to entire Dataframe
df = df.applymap(remove_whitespace)
print(df)
5w9g7ksd

5w9g7ksd9#

实际上,我认为使用select_dtypes可能比if语句快一点:

str_cols = df.select_dtypes(['object'])
df[str_cols.columns] = str_cols.apply(lambda x: x.str.strip())

相关问题