2014-03-14 112 views
1

在下面的熊猫DataFrame熊猫数据帧格式输出

df = pd.DataFrame({'session' : ["1","1","2","2","3","3"], 
       'path' : ["p1","p2","p1","p2","p2","p3"], 'seconds' : ["20","21","132","10","24","45"]}) 

我需要得到像下面这样的输出。 (Pages as columns,sessions as rows and seconds in each cell。)

session,p1,p2,p3 
1,20,21,0 
2,132,10,0 
3,0,24,45 

我到目前为止所做的工作。

In [76]: wordlist = ['p1', 'p2', 'p3'] 
In [77]: df2 = pd.DataFrame(df.groupby('session').apply(lambda x: ','.join(x.path))) 
In [78]: df2 #I have renamed the columns 
Out[78]: 

        path 
     session  
     1  p1,p2 
     2  p1,p2 
     3  p2,p3 

In [79]: df3 = pd.DataFrame(df.groupby('session').apply(lambda x: ','.join(x.seconds.astype(str)))) 
In [80]: df3 #I have renamed the columns 
Out[80]: 
        path 
     session   
     1   20,21 
     2  132,10 
     3   24,45 

以下只是给出了布尔结果。我需要得到我的预期输出。对此有何帮助?

In [84]: pd.DataFrame({name : df2["path"].str.contains(name) for name in wordlist}) 
Out[84]: 
      p1 p2  p3 
session      
1   True True False 
2   True True False 
3  False True True 

回答

2

使用数据透视表:

df.pivot(index='session', columns='path') 

然后替换所有楠与零:

df2 = df1.fillna(0) 

这给你以下的输出:

 seconds   
path   p1 p2 p3 
session     
1   20 21 0 
2   132 10 0 
3    0 24 45 

然后你可能想要删除多索引列:

df1.columns = df1.columns.droplevel(0) 

屈服所需的解决方案(没有引号):

path  p1 p2 p3 
session    
1   20 21 0 
2  132 10 0 
3   0 24 45 

最后,你可以使用StringIO其转换为逗号分隔的字符串:

import StringIO 
s = StringIO.StringIO() 
df1.to_csv(s) 
print s.getvalue() 

用下面的输出:

session,p1,p2,p3 
1,20,21,0 
2,132,10,0 
3,0,24,45 
+0

谢谢juniper- for你很好的解释。 –