首页 > 解决方案 > Pandas 数据框使用应用或矢量化将列转换为 json 列

问题描述

下面是来自 sql 的给定数据框,例如:

ID 类型 三角洲 一个
1 30 X 1 0.1 0.5
1 30 2 0.2 0.6
1 60 X 1 0.3 0.7
1 60 2 0.4 0.8

转换数据框,我想实现这样的事情:

ID day_30 day_60
1 {A:{X1:01,Y2:0.2},B:{X1:0.5,Y2:0.6} {A:{X1:0.3,Y2:0.4},B:{X1:0.7,Y2:0.8}

目前,我可以按 Id 分组,然后按 Days 分组并执行 iterrows。但是对于数百万行来说它非常慢。我怎样才能使它更快任何应用或矢量化示例来做同样的事情将非常有帮助。

当前代码:

grp = df.groupby('id')
row_list = []
for name, df_grp in grp:
  o_row = [id]
  day_grp = df_grp.groupby('days')
    for d_name, df_day_grp:
      a_dict = {}
      b_dict = {}
      for idx, row in df_day_grp.iterrows():
        a_dict[f'{row['type']}{row['delta']}] = row['A']
        b_dict[f'{row['type']}{row['delta']}] = row['B']
      row_dict = { 'A': a_dict, 'B': b_dict }
      o_row.append(json_dumps(row_dict))
 row_list.append(o_row)

df = pd.DataFrame(row_list, columns=cols)

我猜想创建新的数据框并使用 iterrows 可能是缓慢的原因。有任何想法吗?我如何通过使用 apply 或 assign 来实现类似的效果?

标签: pythonjsonpandasdataframevectorization

解决方案


首先加入typewithdeltaDataFrame.pop使用和删除 column delta,然后使用每个组的自定义 lambda 函数GroupBy.apply来创建嵌套字典,最后通过Series.unstackwith重塑DataFrame.add_prefix

c = ['A','B']
df['type'] = df['type'] + df.pop('delta').astype(str)

f = lambda x:  x.set_index('type')[c].to_dict()
df = df.groupby(['id','days']).apply(f).unstack().add_prefix('day_').reset_index()
print (df)
days  id                                             day_30  \
0      1  {'A': {'X1': 0.1, 'Y2': 0.2}, 'B': {'X1': 0.5,...   

days                                             day_60  
0     {'A': {'X1': 0.3, 'Y2': 0.4}, 'B': {'X1': 0.7,...  

推荐阅读