替换pandas数据帧单元格中的多个值 - python

时间:2015-02-02 17:04:58

标签: python pandas cell

我的问题:我有一个pandas数据帧,特别是我需要处理的一列包含由(“:”)分隔的值,在某些情况下,“:”之间的某些值可以是value =值,并且可以出现在字符串的开头/中间/结尾。当我们遍历行时,字符串的长度可以在每个单元格中不同,例如

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

是否有一种pythonic方式查找这些单独的值并替换为与event行对应的event_no列,如输出中所示?我有数百个事件,并试图找到一个聪明的方法来做到这一点。如果我有一个值,pd.merge会完成这个诀窍,但是我很难弄清楚如何处理这些值并且忽略字符串中的“= value”部分

1 个答案:

答案 0 :(得分:1)

编辑以忽略Dict中缺少的键:

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...