表列的Python +熊猫
我是新来的大熊猫,并想分析安排这样一些数据:表列的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
有谁知道如何与大熊猫做到这一点?
当您的数据为表格格式且单个单元格包含值而非集合时,熊猫的工作效果最佳。要有效地使用熊猫来解决问题,您需要更改创建数据表的方式。
最终,它看起来像你想要生成一个表代表对象“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()
谢谢!我试过'expand = data.apply(lambda x:Series(x ['amount']),axis = 1)'然后'melt = pd.melt(expand)'然而,由于列表的长度在这种情况下是不同的,所以我不认为扩展和融合是解决这个问题的好主意。就像你说的,数据的预处理可能这里是最好的解决方案。 – Philip
你能提供生成示例数据的代码?目前尚不清楚您的数据实际是什么,因此很难提供如何执行您所需要的操作说明。 –
示例Dataframe是从mongodb文档列表生成的,格式为'{_id:id,amount:[2,5,1,4],numbering:[x1,x2,y1,z1]}' pandas.DataFrame(list(collection.find({}))' – Philip