2013-06-19 4 views
1

У меня есть редкие панды DataFrame/Series со значениями, которые выглядят как вариации "AB1234:12, CD5678:34, EF3456:56". Что-то эффектДелитесь дважды через фрейм данных в пандах

"AB1234:12, CD5678:34, EF3456:56" 
"AB1234:12, CD5678:34" 
NaN 
"GH5678:34, EF3456:56" 
"OH56:34" 

который я хотел бы преобразовать в

["AB1234","CD5678", "EF3456"] 
["AB1234","CD5678"] 
NaN 
["GH5678","EF3456"] 
["OH56"] 

Такого рода «двойного разграничение» доказывало трудно. Я знаю, что мы можем A = df["columnName"].str.split(","), однако я столкнулся с несколькими проблемами, включая то, что .split(", ") не работает, и '.split (",")' оставляет пробелы. Кроме того, что итерация через сгенерированный A и расщепление, похоже, интерпретирует мои новые списки как «floats». Хотя эта последняя может быть технической трудностью с ipython - я тоже пытаюсь решить эту проблему.

Есть ли способ разграничения на двух типах разделителей - вместо одного? Если нет, как вы выполняете цикл для повторения по внутреннему списку?

// Изменить: изменил апострофа в запятые - это был только мой дислексии ногами в

ответ

1

Вы чуть было не это, обратите внимание, вы можете использовать регулярное выражение для разделения более общо:

In [11]: s2 
Out[11]: 
0 AB1234:12, CD5678:34, EF3456:56 
1    AB1234:12, CD5678:34 
2        NaN 
3    GH5678:34, EF3456:56 
4       OH56:34 
dtype: object 

In [12]: s2.str.split(", '") 
Out[12]: 
0 [AB1234:12, CD5678:34, EF3456:56] 
1    [AB1234:12, CD5678:34] 
2         NaN 
3    [GH5678:34, EF3456:56] 
4       [OH56:34] 
dtype: object 

In [13]: s2.str.split("\s*,\s*'") 
Out[13]: 
0 [AB1234:12, CD5678:34, EF3456:56] 
1    [AB1234:12, CD5678:34] 
2         NaN 
3    [GH5678:34, EF3456:56] 
4       [OH56:34] 
dtype: object 

Где это удаляет пробелы до или после запятой.

+0

Подсказка, связанная с вашим упоминанием регулярного выражения, я обнаружил, что это: 's2.apply (lambda x: re.split (': \ d {1,3},? \ S?', X))' было SUPER close. Я не очень хорошо знаком с регулярным выражением, так что это просто что-то, что я взломал. Я получаю пустой элемент списка в конце из-за последнего шаблона ': \ d \ d', который я не знаю, как избавиться от regex. – stites

+1

@dbyte О, я вижу, я пропустил: бит. Регулярное выражение заменяет * first *: 's2.str.replace (': \ d +', '') .str.split (" \ s *, \ s * ")'. –

+0

безупречный! хотя данные были структурированы как '(", \ s * ")'. Удивительный опоссум. – stites

1

Вот ваш DataFrame

>>> df 
           A 
0 AB1234:12, CD5678:34, EF3456:56 
1    AB1234:12, CD5678:34 
2        None 
3    GH5678:34, EF3456:56 
4       OH56:34 

И теперь я использую split и replace разделить от ', ' и удалить все ':'

>>> df.A = [i.replace(':','').split(", ") if isinstance(i,str) else i for i in df.A] 
>>> df.A 
0 [AB123412, CD567834, EF345656] 
1    [AB123412, CD567834] 
2        None 
3    [GH567834, EF345656] 
4       [OH5634] 
Name: A 
+0

Извинения - я действительно использовал запятые - я только что редактировал вопрос. Мне удалось дойти до этого момента, и я смотрю, как разграничить эти списки с помощью '::'. Затем удалите второй элемент в этих встроенных списках, однако эта часть легко управляема и не входит в объем вопроса. – stites

+0

обновил мой ответ. Надеюсь, это то, что вы искали! –

+0

почти! Я не был ясен и нуждался в том, чтобы избавиться от чисел/баллов после ':'. Я думал, что это создаст список или списки и может удалить второй элемент каждого внедренного списка - баллы. Маршрут регулярного выражения, однако, кажется, сокращает это. – stites

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