【问题标题】:Group a pandas df on variable columns在变量列上对 pandas df 进行分组
【发布时间】:2021-11-25 19:24:42
【问题描述】:

我有一个数据框,我想按如下方式聚合:我想按 col1 和 col6 分组,并为 col2 和 col3 创建一个新列。

col1     col2   col3   col6
a        it1    3      f
a        it2    5      f
b        it6    7      g
b        it7    8      g

我希望结果如下所示:

col1   col6  new_col
a      f     pd.DataFrame({"col2": ["it1", "it2"],"col3":[3,5]})
b      g     pd.DataFrame({"col2": ["it6", "it7"],"col3":[7,8]})      

我尝试了以下方法:

def aggregate(gr):
     return(pd.DataFrame("col2":gr["col2"], "col3":gr["col3"]))
df.groupby("col1").agg(aggregate)

但聚合似乎不是解决此问题的正确方法。 这样做的正确方法是什么?

【问题讨论】:

  • 您希望new_col 中的每个单元格都成为一个DataFrame?
  • 我随后将 df 转换为 json 并希望将其分组。

标签: python pandas pandas-groupby aggregate


【解决方案1】:

尚不完全清楚您要达到的目标,因此这里有两个想法。首先,如果你无论如何要转换成json,你可以将每个组转换成json:

df.groupby(['col1','col6']).apply(lambda d: d.to_json())

生产

col1  col6
a     f       {"col1":{"0":"a","1":"a"},"col2":{"0":"it1","1...
b     g       {"col1":{"2":"b","3":"b"},"col2":{"2":"it6","3...

其次,您可以在数据框内有数据框,您可以这样做:

dd = {}
for idx, gr in df.groupby(['col1','col6']):
    dd[idx] = aggregate(gr)
dfout = pd.DataFrame(columns = ['newcol'], index = dd.keys())
for idx in dfout.index:
    dfout.at[idx, 'newcol'] = dd[idx]

这是在tabulate package:nicely 的帮助下打印出来的:

from tabulate import tabulate
print(tabulate(dfout, headers = 'keys'))

            newcol
----------  ------------
('a', 'f')     col2  col3
            0  it1     3
            1  it2     5
('b', 'g')     col2  col3
            2  it6     7
            3  it7     8

dfout 内也有正确的 DataFrame。转换成 json 后是这样的:

dfout.to_json()
'{"newcol":{"(\'a\', \'f\')":{"col2":{"0":"it1","1":"it2"},"col3":{"0":3,"1":5}},"(\'b\', \'g\')":{"col2":{"2":"it6","3":"it7"},"col3":{"2":7,"3":8}}}}'

【讨论】:

    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    相关资源
    最近更新 更多