有没有办法修剪一系列字符串对象而不使用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'
任何帮助表示赞赏。
答案 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}}更少贪心,以便在括号外计算空格。
最后,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'])
对不起,如果我偏离主题: - )