如何汇总熊猫交叉表中的行并创建新的交叉表?

时间:2019-07-18 19:54:52

标签: python python-3.x pandas crosstab

我有一个在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”,我想对包含它的所有行进行求和。如果我以“军事”为名,我想将行汇总成军事行。...

最好的方法是什么?

3 个答案:

答案 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