2016-09-28 78 views
2

我是新来的大熊猫,并想分析安排这样一些数据:表列的Python +熊猫

label      aa      bb 
index 
    0   [2, 5, 1, 4]   [x1, x2, y1, z1] 
    1    [3, 3, 19]    [x3, x4, y2] 
    2 [6, 4, 2, 8, 9, 10] [y1, y2, z3, z4, x1, w] 

其中X1,X2,X3,X4是M型的; y1,y2是N型; z1,z2,z3,z4的类型为O.请注意,data [2,'bb']是w,它不属于任何类型。这种关系在MongoDB中定义如下

{'_id' : ObjectId(x1), type : 'M'} 
{'_id' : ObjectId(y1), type : 'N'} 
{'_id' : ObjectId(z1), type : 'O'}... 
db.data.find({'_id' : ObjectId(w)}) is null 

所需的输出会是这样的:

label  sum_M sum_N sum_O 
index 
    0   7  1  4 
    1   6  19  0 
    2   9  10  10 

有谁知道如何与大熊猫做到这一点?

+0

你能提供生成示例数据的代码?目前尚不清楚您的数据实际是什么,因此很难提供如何执行您所需要的操作说明。 –

+0

示例Dataframe是从mongodb文档列表生成的,格式为'{_id:id,amount:[2,5,1,4],numbering:[x1,x2,y1,z1]}' pandas.DataFrame(list(collection.find({}))' – Philip

回答

2

当您的数据为表格格式且单个单元格包含值而非集合时,熊猫的工作效果最佳。要有效地使用熊猫来解决问题,您需要更改创建数据表的方式。

最终,它看起来像你想要生成一个表代表对象“ID”,“金额”,和“编号”的列表。

id  amount numbering 
0 abc 2   x1 
1 abc 5   x2 
2 abc 1   y1 
3 abc 4   z1 
4 def 3   x3 
etc. 

为了创建这个表,你大概可以使用字典的列表,包含在你的表中的一行数据每个字典,如:

{'id':'abc', 'amount': 2, 'numbering':'x1'} 

您可以构建从这个熊猫数据帧清单:Convert list of dictionaries to Dataframe

那么你就可以添加一个代表,每个“编号”值相关联的类型的列:

data['dbtype'] = data.numbering.map(lambda num: {'x':'M','y':'N','z':'O'}.get(num[0], 'None')) 

那么你可以使用GROUPBY:

data.groupby('dbtype').sum() 
+0

谢谢!我试过'expand = data.apply(lambda x:Series(x ['amount']),axis = 1)'然后'melt = pd.melt(expand)'然而,由于列表的长度在这种情况下是不同的,所以我不认为扩展和融合是解决这个问题的好主意。就像你说的,数据的预处理可能这里是最好的解决方案。 – Philip