2015-11-03 57 views
2

我有超过1M的行,并希望像123456789(长度= 9)拆分串的系列为3个系列(如MS Excel可以做):分割系列串长度

c1 c2 c3 
123 456 789 
... ... ... 

我看到.str.split功能需要一些分隔符和.str.slice一次只给出一个系列。有没有smth。比这更好?

s21 = s11.str.slice(0,3) 
s22 = s11.str.slice(3,6) 
s23 = s11.str.slice(6,9) 
+0

'我想拆分1M!'不会花费太多时间,除非您要在生产环境中部署代码。 – WoodChopper

回答

1

您可以使用str.extract

>>> df 
     s11 
0 123456789 
1 987654321 
>>> df['s11'].str.extract('(.{3,3})' * 3) 
    0 1 2 
0 123 456 789 
1 987 654 321 

不过,当一些简单的像str.slice作品,它往往比使用不必要的正则表达式快,即使你需要手动调用它几次或者使用for循环。

您可以在一个班轮做str.slice为:

>>> df['a'], df['b'], df['c'] = map(df['s11'].str.slice, [0, 3, 6], [3, 6, 9]) 
>>> df 
     s11 a b c 
0 123456789 123 456 789 
1 987654321 987 654 321 
1

如果你需要做的是分裂固定长度的字符串成更小的,大小相等的固定长度的字符串,你可以这样做:

s = "123456789" 
x = [s[i:i+3] for i in range(0, 9, 3)] 
+0

我想一次拆分1M个字符串! 。)我认为这会比纯熊猫更耗时 – Winand

+0

嗯,这取决于你打算如何处理它们。但我真的不认为将它们打包到列表中会产生任何明显的差异,特别是如果您在循环外评估range()表达式并重用它。你的程序将被I/O绑定,而不是计算绑定。 –

+0

是啊,它已经I/O限制,因为我必须从MS访问读取〜1.5GB的字符串数据。至少想要快速处理它 – Winand