2015-02-02 2 views
1

ОБНОВЛЕНО - Извините заранее, если я не задал вопрос правильно, но я впервые спросил на сайте!Обновлено - замена нескольких значений в ячейке dataframe pandas - python

Моя проблема: у меня есть фрейм данных pandas и один столбец, в котором мне нужно обрабатывать, содержит значения, разделенные (0: 0): , а в некоторых случаях некоторые из этих значений между «:» могут быть значением = значение , и может появляться в начале/середине/конце строки. Длина строки может различаться в каждой ячейке при повторении по строке, например.

clickstream['events'] 
1:3:5:7=23 
23=1:5:1:5:3 
9:0:8:6=5:65:3:44:56 
1:3:5:4 

У меня есть файл, который содержит значения поиска этих чисел, например. требуется

event_no,description,event 
1,xxxxxx,login 
3,ffffff,logout 
5,eeeeee,button_click 
7,tttttt,interaction 
23,ferfef,click1 

выход:

clickstream['events'] 
login:logout:button_click:interaction=23 
click1=1:button_click:login:button_click:logout 

Есть ли вещий способ смотреть эти индивидуальные значения и замены с event колонке, соответствующей строке event_no, как показано на выходе? У меня есть сотни событий и попытка выработать умный способ сделать это. pd.merge бы сделал трюк, если у меня было одно значение, но я изо всех сил работать, как я могу работать по значениям и игнорировать «= значение» часть строки

Спасибо заранее!

ответ

1

РЕДАКТИРА игнорировать недостающие ключи в Словаре:

import pandas as pd 

EventsDict = {1:'1:3:5:7',2:'23:45:1:5:3',39:'0:8:46:65:3:44:56',4:'1:3:5:4'} 
clickstream = pd.Series(EventsDict) 
#Keep this as a dictionary 
EventsLookup = {1:'login',3:'logout',5:'button_click',7:'interaction'} 

def EventLookup(x): 
    list1 = [EventsLookup.get(int(item),'Missing') for item in x.split(':')] 
    return ":".join(list1) 

clickstream.apply(EventLookup) 

Поскольку вы используете полный DF, а не только серию, используйте:

clickstream['events'].apply(EventLookup) 
Output: 
1     login:logout:button_click:interaction 
2    Missing:Missing:login:button_click:logout 
4      login:logout:button_click:Missing 
39 Missing:Missing:Missing:Missing:logout:Missing... 
+0

Привет @Liam Фоль - Спасибо за ответ. Я попытался воспроизвести выше, но, похоже, получил следующую ошибку: «AttributeError: (« Объект «Серии» не имеет атрибута «split», u'occurred at index 1 ') '. Единственное изменение в ваших повторных утверждениях заключалось в том, чтобы 'clickstream = pd.DataFrame (EventsDict)' как 'clickstream = pd.DataFrame ([EventsDict])', чтобы избежать ошибки 'ValueError: если вы используете все скалярные значения, вы должны пройти индекс' ... любые идеи? спасибо – Maruhk

+0

@Maruhk Звучит как приложение не работает. Можете ли вы разместить точный код, который у вас есть? Если вы используете полный фреймворк данных, вам нужно будет сделать что-то вроде: DF ['COL'] = DF ['COL']. Apply (lambda x: ....... –

+0

похоже, что мой поисковый словарь был не создан должным образом, но после вашего метода я реплицировал преобразование и запустил функцию, но, похоже, получил ошибку при первом значении в наборе данных clickstream. Я скопировал код в следующем месте [ClickStream - ссылка на код и выходная ошибка] (http : //pastebin.com/jmxsK3fh) - спасибо – Maruhk

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