Pandas中的动态λ数和apply语句

sgtfey8w  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(132)

我正在尝试创建一个嵌套的JSON块,遇到了这个很棒的解决方案Pandas grouping by multiple columns to get a multi nested Json

test = [df.groupby('cat_a')\
          .apply(lambda x: x.groupby('cat_b')\
                            .apply(lambda x: [x.groupby('cat_c')
                                               .apply(lambda x: x[['participants_actual','participants_registered']].to_dict('r')
                                                      ).to_dict()]
                                  ).to_dict()
          ).to_dict()]

import json
json_res = list(map(json.dumps, test))

这对我的用例很有效。但是,由于我不能在所有情况下控制 Dataframe ,可能不止这里提到的三个级别。
我可以很容易地想象得到的水平如下:

for c in cols[:-2]:
   .... perform level gropuping

然而,由于lamba和apply函数都是上一级的函数,我不确定如何在for循环中编写这样的语句。
有没有一条途径可以使这一陈述更有活力?

efzxgjgh

efzxgjgh1#

将 Dataframe 的索引设置为要嵌套的列,并同时按所有这些列进行分组。创建一个helper函数,根据键序列设置嵌套字典,并将其应用于每个组的键。group.to_dict("records")为每个嵌套字典中的剩余列提供字典列表。

def set_nested_dict_by_path(d, path, value):
    for key in path[:-1]:
        d = d.setdefault(key, {})
    d[path[-1]] = value
    
def to_nested(df):
    r = {}
    for keys, group in df.groupby(df.index):
        set_nested_dict_by_path(r, keys, group.to_dict("records"))
    return r

df = pd.DataFrame({"col1": [1, 1, 1, 1, 2, 2, 2], "col2": [3, 3, 4, 4, 5, 5, 6], "col3": [7, 8, 9, 10, 11, 12, 13], "col4": [14, 15, 16, 17, 18, 19, 20]})
print(to_nested(df.set_index(["col1", "col2"])))
xqkwcwgp

xqkwcwgp2#

你试过让它递归吗?

def myfunc(df):
   if len(df.columns.values) > 1 :
      return [df.groupby[df.columns.values[0]].apply(myfunc)].to_dict()
   else :
      return [df].to_dict()

相关问题