Как разбить столбец на два столбца по первому и последнему найденному шаблону в Pandas (Python 3.x) - PullRequest
0 голосов
/ 16 ноября 2018

У меня проблема с разбиением столбца на два столбца. Я хочу разбить столбец по первому и последнему найденному шаблону '-'. Может быть, это тривиально.

Вот моя колонка:

        col1
0       aa-bb-cc-dd
1       aa-bb-cc
2       aa-bb-cc
3       aa-bb-cc-dd

Это кадр, который я хочу получить в результате:

        col1           col2
0       bb-cc          dd
1       bb             cc
2       bb             cc
3       bb-cc          dd

Заранее спасибо!

Ответы [ 5 ]

0 голосов
/ 16 ноября 2018

Это может помочь:

df['col2'] = df['col1'].split('-')[-1]
df['col1'] = '-'.join(i for i in df['col1'].split('-')[1:-1])
0 голосов
/ 16 ноября 2018

Вы можете использовать понимание списка:

df = pd.DataFrame([i.split('-', 1)[1].rsplit('-', 1) for i in df['col1']],
                  columns=['col1', 'col2'])

print(df)

    col1 col2
0  bb-cc   dd
1     bb   cc
2     bb   cc
3  bb-cc   dd

Панды str методы существуют в основном для удобства.Для чистых данных может оказаться, что понимание списка более эффективно для больших фреймов данных.

0 голосов
/ 16 ноября 2018

Первый срез и использование str.rsplit и rename:

df = df.col1.str[3:].str.rsplit('-', n=1, expand=True).rename(columns={0:'col1',1:'col2'})

print(df)
    col1 col2
0  bb-cc   dd
1     bb   cc
2     bb   cc
3  bb-cc   dd
0 голосов
/ 16 ноября 2018

Вот идиоматический, но медленный способ сделать это:

df.col1 = df.col1.str.split('-', 1).str[1] # discard first part
parts = df.col1.str.rsplit('-', 1).str
df.col1 = parts[0]
df['col2'] = parts[1]

Хотя это работает, это не быстро: около 4 секунд для 700 тыс. Строк.Глядя на это, можно подумать, что это хороший способ сделать это, но с точки зрения производительности это хуже, чем все альтернативы.

0 голосов
/ 16 ноября 2018

Если я хорошо понимаю ваш вопрос, вам нужно избавиться от первого блока, разделенного символом «-», а затем разделить последний блок «-» на столбец col2.Если это то, что вам нужно, вы можете рассмотреть это:

df= pd.DataFrame({'col1':['aa-bb-cc-dd', 'aa-bb-cc', 'aa-bb-cc', 'aa-bb-cc-dd']})
df['col2'] = df['col1'].apply(lambda x: x[x.rfind('-')+1:])
df['col1'] =  df['col1'].apply(lambda x: x[x.find('-')+1:x.rfind('-')])
print (df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...