2015-11-03 89 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