Разделить один столбец на два с помощью определенных символов в Python - PullRequest
0 голосов
/ 29 октября 2019

Я использую Python3 и мне нужно разделить столбец price, который смешал вместе price_value и price_unit в кадре данных, пример данных выглядит как 20dollar/m2/month или 1.8dollar/m2/day, я хочу разбить их на этот формат по словуdollar:

price_value      price_unit
20             dollar/m2/month
1.8            dollar/m2/day

Я пытался использовать следующий код:

Вариант 1:

df['price_value'] = df['price'].apply(lambda row: row.split('dollar')[0])
df['price_unit'] = df['price'].apply(lambda row: row.split('dollar')[-1])

Вариант 2:

df['price_value'], df['price_unit'] = df1["price"].str.split('dollar', 1).str

Но я получаю:

price_value      price_unit
20                /m2/month
1.8               /m2/day

Как их правильно разделить? Спасибо.

Ответы [ 2 ]

3 голосов
/ 29 октября 2019

Вы можете использовать str.extract с регулярным выражением r'(?P<price_value>.*?)(?P<price_unit>dollar.*)':

>>> import pandas as pd
>>> df = pd.DataFrame(data=['20dollar/m2/month', '1.8dollar/m2/day'], columns=['price'])
>>> df['price'].str.extract(r'(?P<price_value>.*?)(?P<price_unit>dollar.*)')
  price_value       price_unit
0          20  dollar/m2/month
1         1.8    dollar/m2/day

См. Демонстрационную версию регулярного выражения .

Подробности

  • (?P<price_value>.*?) - группа "price_value": любые 0+ символов, кроме символов разрыва строки, как можно меньше
  • (?P<price_unit>dollar.*) - группа "price_unit": dollar и любые0+ символов, отличных от символов разрыва строки, как можно больше.

Я предполагаю, что у вас нет разрывов строк на входе, но если они у вас есть, добавьте шаблон со строчкойМодификатор DOTALL, (?s): r'(?s)(?P<price_value>.*?)(?P<price_unit>dollar.*)'

Чтобы добавить вновь извлеченные столбцы в существующий фрейм данных, вы также можете использовать

df[['price_value', 'price_unit']] = df['price'].str.extract(r'(.*?)(dollar.*)')

Здесь именованные группы захвата не нужны, посколькуВы определяете имена столбцов заранее.

2 голосов
/ 29 октября 2019

Вы можете сделать:

df = pd.DataFrame(data=['20dollar/m2/month', '1.8dollar/m2/day'], columns=['price_unit'])

# split by capture group
result = df['price_unit'].str.split('(dollar.*$)', expand=True).drop(2, axis=1)

# rename columns
result.columns = ['price_value', 'price_unit']

print(result)

Вывод

  price_value       price_unit
0          20  dollar/m2/month
1         1.8    dollar/m2/day
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...