2015-11-03 2 views
2

у меня больше строк 1M и хотите разделить набор строк, как 123456789 (длина = 9) в 3-й серии (например, MS Excel может сделать):Split серии по длине строки

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

Я вижу .str.split которая требует некоторого разделителя и .str.slice, который дает только одну серию за раз. Есть что-то. лучше чем это?

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() вне цикла и повторно используете его. Ваша программа будет связана с вводом-выводом, а не с оценкой. –

+0

Да, это уже связано с i/o, потому что мне нужно читать ~ 1.5gb строковых данных из ms доступа. По крайней мере, хотите быстро его обработать – Winand

Смежные вопросы