pandas groupby 到嵌套的 json -- 不想要计算字段

Mag*_*gie 1 python json pandas d3.js

我正在处理 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
Run Code Online (Sandbox Code Playgroud)

现在,放入熊猫,合并并清理:

     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
Run Code Online (Sandbox Code Playgroud)

现在,分组

group = df.groupby(['state', 'demography'])
Run Code Online (Sandbox Code Playgroud)

产量

<pandas.core.groupby.DataFrameGroupBy object at 0x106939610>
Run Code Online (Sandbox Code Playgroud)

试试这个:

group = df.groupby(['state', 'demography']).count()
Run Code Online (Sandbox Code Playgroud)

产生一些几乎正确的东西,除了我不想计算任何东西,我只想要“率”

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
Run Code Online (Sandbox Code Playgroud)

果然,这只会为每个值导出“1”,哈哈:

group.reset_index().to_json("myjson2.json", orient="index")
Run Code Online (Sandbox Code Playgroud)

dang 我快到了,我如何导出它以便每个州都是父级?

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

    },
    {
        "state": "Georgia",
        "over 65": 23,
        "18-65": 55
    }
]
Run Code Online (Sandbox Code Playgroud)

And*_*den 5

count 方法计算每列中每个组的非 NaN 条目的数量,因此为什么它们在这里都是 1(每个组的大小为 1,没有 NaN)。
(我找不到特定链接,但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
Run Code Online (Sandbox Code Playgroud)

我认为您正在寻找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}]'
Run Code Online (Sandbox Code Playgroud)

  • 呜呼!它就像 Excel,只是很酷。一个补充 - 无论出于何种原因,它都将“速率”视为类型对象,而不是浮动对象。它给了我错误“没有要聚合的数字类型”。所以我不得不将它转换为浮点数:df.convert_objects('rate', convert_numeric=True) (3认同)