pandas groupby 生成嵌套json -- 不需要计算字段

1 投票
1 回答
2745 浏览
提问于 2025-04-20 22:19

我正在做一个d3.js的图形。我的数据在一个很大的多标签的.xls文件里。我需要从每个标签中提取数据,所以我决定把所有数据放到pandas里,然后导出一些.json文件。

原始数据,分布在很多标签中:

demography, area, state, month, rate
over 65,   region2, GA, May, 23
over 65,  region2, AL, May, 25
NaN,  random_odd_data, mistake, error
18-65, region2, GA, 77
18-65, region2, AL, 75

现在,把数据放进pandas,合并并清理了一下:

     demography area     state  month rate
0    over 65    region2  GA     May   23
1    over 65    region2  AL     May   25
2    18-65      region2  GA     May   50
3    18-65      region2  AL     May   55

现在,进行分组:

group = df.groupby(['state', 'demography'])

得到的结果是:

<pandas.core.groupby.DataFrameGroupBy object at 0x106939610>

尝试这个:

group = df.groupby(['state', 'demography']).count()

得到的结果几乎正确,不过我不想计算任何东西,我只想要“比率”。

state    demography  area   month  rate
AL       over 65     1      1      1
         18-65       1      1      1
GA       over 65     1      1      1
         18-65       1      1      1

果然,这样导出每个值都是“1”,哈哈:

group.reset_index().to_json("myjson2.json", orient="index")

真是快到了,我该怎么导出,让每个州成为一个父级呢?

[
    {
        "state": "Alabama",
        "over 65": 25,
        "18-65": 50

    },
    {
        "state": "Georgia",
        "over 65": 23,
        "18-65": 55
    }
]

1 个回答

5

count方法用来计算每个组在每一列中非空值的数量,所以这里的结果都是1(因为每个组只有一个数据,且没有空值)。
(我找不到具体的链接,但在groupby文档中有提到。)


我觉得你其实想要的是pivot_table

In [11]: res = df.pivot_table('rate', 'state', 'demography')

In [12]: res
Out[12]:
demography  18-65  over65
state
AL             55      25
GA             50      23

我认为你需要使用orient='records'(不过你需要先reset_index):

In [13]: res.reset_index().to_json(orient='records')
Out[13]: '[{"state":"AL","18-65":55,"over65":25},{"state":"GA","18-65":50,"over65":23}]'

撰写回答