2015-11-09 1 views
0

У меня есть DataFrame под названием ДФ, которая содержит данные ниже:Панда: Создать новый столбец в DataFrame из другого столбца, требующая строка манипуляции

Index Column1   Column2 
0  SEP_2013_QUANTITY 4 
1  SEP_2013_PRICE  4.99 
2  JAN_2013_PRICE  8 
3  JAN_2013_QUANITY 10.99 

Мне нужно создать DataFrame как ниже. Месяц в формате YYYY-MM-DD с днем ​​всегда быть 15:

Index MONTH  PRICE QUANTITY 
0  2013-09-15 4.99  4 
1  2013-01-15 10.99 8 

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

Я пытаюсь что-то вроде:

df['new_column'] = str.rsplit(df.Column1,'_',1)[0] 

Это должно вернуть что-то вроде 'JAN_2013'.

Мне также нужно проверить наличие _QUANTITY или _PRICE в столбце 1, чтобы узнать, следует ли поместить значение в новую колонку PRICE или QUANTITY.

Заранее благодарим за помощь/руководство.

+0

Try применяя .str к вашему столбцу, а затем используйте строковые методы по вашему выбору: 'df.Column1.str. ... ' – leroyJr

ответ

0

Я предлагаю вам создать новый столбец 'Тип', а затем использовать pivot:

In [32]: 

df['Month'] = pd.to_datetime(df.Column1.str.slice(4, 8) + 
          '-'+ 
          df.Column1.str.slice(0, 3) + 
          '-15') 
df['Type'] = df.Column1.str.slice(start=9) 

In [33]: 
#reset index if don't want date-time index 
print df.pivot(index='Month', columns='Type', values='Column2') 

Type  PRICE QUANTITY 
Month      
2013-01-15 8.00  10.99 
2013-09-15 4.99  4.00 
1

Чтобы извлечь только месяц-год часть из полученного списка, созданного раскола, применить map и лямбда к результату:

df['Column1'].str.rsplit('_', 1).map(lambda x: x[0]) 

Если дать вам только части MMM_YYYY, что, как ожидается.

Или, как @DSM предлагает применить str снова вместо карты-лямбда:

df['Column1'].str.rsplit('_', 1).str[0] 
+2

Вместо карты/лямбда вы можете напрямую использовать' .str [0] '. – DSM

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