столбцы строки разделения, в то время как первая часть перед шаблоном разделения отсутствует - PullRequest
1 голос
/ 03 октября 2019

Я пытаюсь разбить столбец строки на разные столбцы и пробовал Как разбить столбец на два столбца?

Шаблон строк выглядит следующим образом:

import pandas as pd
import numpy as np

>>> data = {'ab': ['a - b', 'a - b', 'b', 'c', 'whatever']}
>>> df = pd.DataFrame(data=data)

          ab
0      a - b
1      a - b
2          b
3          c
4   whatever

>>> df['a'], df['b'] = df['ab'].str.split('-', n=1).str

         ab          a          b
0     a - b          a          b
1     a - b          a          b
2         b          b        NaN
3         c          c        NaN
4  whatever    whatever       NaN


Ожидаемый результат:

         ab          a          b
0     a - b          a          b
1     a - b          a          b
2         b        NaN          b
3         c        NaN          c
4  whatever        NaN   whatever

Метод, который я придумал:

df.loc[~ df.ab.str.contains(' - '), 'b'] = df['ab']
df.loc[~ df.ab.str.contains(' - '), 'a'] = np.nan

Есть ли более общий / эффективный способ решения этой задачи?

Ответы [ 2 ]

1 голос
/ 03 октября 2019

мы можем extractall, пока мы знаем конкретные строки для извлечения:

df.ab.str.extract(r"(a)?(?:\s-\s)?(b)?")
Out[47]: 
     0    1
0    a    b
1    a    b
2  NaN    b
3    a  NaN

используемые данные:

data = {'ab': ['a - b', 'a - b', 'b','a']}
df = pd.DataFrame(data=data)

с вашим редактированием, кажется, ваша цель состоит в том, чтобыпоместите что-нибудь, что само по себе во второй столбец. Вы могли бы сделать:

df.ab.str.extract(r"(\S*)(?:\s-\s)?(\b\S+)")
Out[59]: 
   0         1
0  a         b
1  a         b
2            b
3            c
4     whatever
1 голос
/ 03 октября 2019

Я буду использовать get_dummies

s=df['ab'].str.get_dummies(' - ')

s=s.mask(s.eq(1),s.columns.tolist()).mask(s.eq(0))
s
Out[7]: 
     a  b
0    a  b
1    a  b
2  NaN  b

Обновление

df.ab.str.split(' - ',expand=True).apply(lambda x : pd.Series(sorted(x,key=pd.notnull)),axis=1)
Out[22]: 
      0         1
0     a         b
1     a         b
2  None         b
3  None         c
4  None  whatever
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...