我有一个在excel表格中的数据,该表格是我在熊猫交叉表中总结的。我想通过汇总相关行来进一步对数据进行分类。
这是我的交叉表:
var MongoClient = require('mongodb').MongoClient; var url = "mongodb://localhost:27017/"; var x; MongoClient.connect(url, function(err, db) { if (err) throw err; var dbo = db.db("mydb"); dbo.collection("test").findOne( {}, { sort: { _id: -1 } }, (err, data) => { console.log(data); x = data; }, ); db.close(); }); console.log(x);
我只需要4个小组:民间,政府,商业和军事。如果名称中包含“ Government”,我想对包含它的所有行进行求和。如果我以“军事”为名,我想将行汇总成军事行。...
最好的方法是什么?
答案 0 :(得分:1)
按每个名称的第一部分分组会产生
df.groupby(df.class_of_orbit.str.split('/').str.get(0)).sum()
Elliptical GEO LEO MEO All
class_of_orbit
All 21 182 648 32 883
Civil 0 0 38 0 38
Commercial 3 99 412 0 514
Government 9 16 130 0 155
Military 9 67 68 32 176
答案 1 :(得分:1)
pd.crosstab
从头开始
pd.crosstab(df.users.str.split('/').str[0], df.class_of_orbit)
groupby
在您已有的东西之上。如果您将可调用对象传递给groupby
,则会将其应用于索引并使用结果进行分组。
xtab.groupby(lambda x: x.split('/')[0]).sum()
Elliptical GEO LEO MEO All
All 21 182 648 32 883
Civil 0 0 38 0 38
Commercial 3 99 412 0 514
Government 9 16 130 0 155
Military 9 67 68 32 176
答案 2 :(得分:1)
喜欢拉斐尔(Rafael)和piRSquared的答案,但是如果您想对仅包含该组 instance 的所有行求和,而不仅是该组是名称的第一部分,则可以更改piRsquared的答案。
您可以定义一个辅助函数,以检查名称是否包含第二部分,然后创建第二个数据框,其中包含确实包含该名称第二部分的那些行的总和。然后将这个元素逐个求和,结果由rafael和piRSquared显示。我省略了“全部”观察,但是可以很容易地从结果数据框中计算得出。
希望这很好,我是新来的人。
def second_parts_sum(x):
if len(x.split('/')) > 1:
return x.split('/')[1]
else:
return 'to_be_dropped'
first_parts = xtab.groupby(lambda x: x.split('/')[0]).sum()
second_parts = xtab.groupby(lambda x: second_parts_sum(x)).sum()
first_parts = first_parts[first_parts.index != 'All']
second_parts = second_parts[second_parts.index != 'to_be_dropped']
first_parts + second_parts
Elliptical GEO LEO MEO All
Civil 0 0 50 0 50
Commercial 3 101 493 32 629
Government 9 16 132 0 157
Military 9 67 69 32 177