如何在python中修剪一系列字符串对象?

时间:2014-01-27 12:36:59

标签: python pandas strip

有没有办法修剪一系列字符串对象而不使用for循环。我可以按元素执行此元素。我有一系列a

print a
0    164
1     164
2     164
3     164
4     164
5     164

现在我必须在每个“164”的开头删除空格。  a.strip()会产生AttributeError: 'Series' object has no attribute 'strip' 任何帮助表示赞赏。

5 个答案:

答案 0 :(得分:3)

使用str.strip删除空格:

df = pd.DataFrame({'a': ['164', ' 164', '    164']})
for item in df.a:
    print (len(item))
3
4
7
In [11]:

df.a = df.a.str.strip(' ')
for item in df.a:
    print (len(item))
3
3
3

要转换为ints,请执行以下操作:

In [20]:

df.a = df.a.astype(int)
df.dtypes

Out[20]:
a    int32
dtype: object

答案 1 :(得分:1)

您的数据或代码没有任何问题,但是要彻底检查数据,即使一行没有正确的数据,并且您尝试转换系列的特定列类型,但是整个系列正在考虑,因此你的问题..

减少测试集并检查几行,它应该可以正常工作。

答案 2 :(得分:1)

如果您只需要将其转换为int,那么df[0].astype(int)怎么样?

In [16]: df = pd.DataFrame([' 164', '164', '164 ', '  164  '])

In [17]: df
Out[17]: 
         0
0      164
1      164
2     164 
3    164  

[4 rows x 1 columns]

In [18]: df.dtypes
Out[18]: 
0    object
dtype: object

In [19]: df[0] = df[0].astype(int)

In [20]: df.dtypes
Out[20]: 
0    int64
dtype: object

In [21]: df
Out[21]: 
     0
0  164
1  164
2  164
3  164

[4 rows x 1 columns]

答案 3 :(得分:1)

你应该使用正则表达式:

import re

trim_function = lambda x : re.findall("^\s*(.*?)\s*$",str(x))[0]

解释一下:

  • 字符^表示字符串的开头,$表示字符串的结尾;这样你的表达式就会找到1匹配。

  • \s表示任何空格字符。所以\s*是空格的任何序列(甚至是空的)。

  • .*?是任何字符的任何序列。我无法准确解释原因,但是?符号让这个经验比<{1}}更少贪心,以便在括号外计算空格。

    < / LI>
  • 最后,parethesis \s*意味着你在它们内部的子串中交叉:修剪表达式。

由于(...)提供了匹配子字符串的列表,我们必须选择第一个元素。

现在,对于DataFrame:

re.findall

对于系列

df = pd.DataFrame([' 164', '164', '164 ', '  164  '])
df.applymap(trim_function)

索引

df = pd.Series([' 164', '164', '164 ', '  164  '])
df.apply(trim_function)

编辑:忘了:如果您不想删除每个字符串末尾的空格,只需使用模式df = pd.Index([' 164', '164', '164 ', ' 164 ']) df.map(trim_function)

答案 4 :(得分:0)

我从未使用过熊猫,但如果我理解正确,你可能会想做这样的事情。

from pandas import DataFrame
df = DataFrame({'a': ['164', ' 165']})
for index, row in df.iterrows():  
    print int(row['a'])

对不起,如果我偏离主题: - )