Извлечение года и месяца из пользовательского текстового поля - PullRequest
4 голосов
/ 14 апреля 2019

У меня есть фрейм данных со столбцом, который содержит информацию о количестве лет / месяцев, в течение которых у человека есть аккаунт в организации.

Поле имеет пользовательский текстовый формат,

, например: '0yrs 11mon', '15yrs 4mon' и т. Д.

Есть ли способизвлечь только для извлечения лет и месяцев в отдельный столбец, как показано ниже:

Member Since | Year | Mon
-------------------------

'0yrs 11mon' | 0 | 11 
-------------------------------------------

'15yrs 4mon' | 15 | 4
---------------------

Ответы [ 5 ]

6 голосов
/ 14 апреля 2019

Вы можете использовать Series.str.extract :

df['Year'] = df['Member Since'].str.extract('(\d+)(?:yrs)')
df['Mon'] = df['Member Since'].str.extract('(?:\s)(\d+)(?:mon)')

?: - это запись группы без записи. Это означает, что оно соответствует регулярному выражению, но не фиксируется в выводе

Вы также можете попробовать Series.str.extractall :

df[['year','mon']]= df['Member Since'].str.extractall('(\d+)').unstack()
df
  Member Since  year    mon
0   0yrs 11mon   0      11
1   15yrs 4mon   15      4

Функция extractall на самом деле возвращает DataFrame с одной строкой для каждого совпадения и одним столбцом для каждой группы, поэтому вам необходимо снять ее.

Используйте метод извлечения всех, только если у вас есть числа, как показано в вашем вопросе. Больше или меньше двух вернет ошибку.

2 голосов
/ 14 апреля 2019

Regex альтернатива с использованием str.extract решения будет,

df["Year"] = df["Member Since"].str.extract("(\d+)yrs")
df["Mon"] = df["Member Since"].str.extract("(\d+)mon")
0 голосов
/ 14 апреля 2019

Использование str.findall

pd.DataFrame(df['Member Since'].str.findall('\d+').tolist(),columns=['Year','Mon'])
  Year Mon
0    0  11
1   15   4
0 голосов
/ 14 апреля 2019
df[['year', 'month']] = df['Member Since'].str.split(' ').apply(lambda x: [''.join(re.findall(r'\d',i)) for i in x]).apply(pd.Series)

выход

  Member Since year month
0   0yrs 11mon    0    11
1   15yrs 4mon   15     4
0 голосов
/ 14 апреля 2019

Если у вас есть данные в Excel, то это может сработать: -

import pandas as pd
data=pd.read_excel('filename')
month=data['Mon']  
year=data['Year']
...