我有包含以下列的数据帧:

ID A1 B1 C1 A2 B2 C2 A3 B3 C3
AA  1  3  6           4  0  6 
BB  5  5  4  6  7  9 
CC  5  5  5           

我想创建一个名为Z的新列,它接受每一行,将它们分组到一个JSON记录列表中,并将该列重命名为它们的键.在构造JSON列之后,我想删除所有列,只保留Z和ID.

以下是所需的输出:

ID Z
AA [{"A":1, "B":3,"C":6},{"A":4, "B":0,"C":6}]
BB [{"A":5, "B":5,"C":4},{"A":6, "B":7,"C":9}]
CC [{"A":5, "B":5,"C":5}]

这是我目前的try :

df2 = df.groupby(['ID']).apply(lambda x: x[['A1', 'B1', 'C1',
                                            'A2', 'B2', 'C2', 'A3', 'B3', 'C3']].to_dict('records')).to_frame('Z').reset_index()

问题是我不能重命名这些列,这样就只保留字母,删除数字,就像上面的例子一样.与在我的列表中创建两个对象相反,运行上面的代码也不会将每组3个对象分隔为一个对象.如果可能的话,我想在Pandas 身上做到这一点.任何指导都是非常感谢的.

推荐答案

Pandas 药水

通过拆分并围绕正则表达式分隔符展开,将列转换为MultiIndex,然后将数据帧转换为stack以将数据帧转换为多索引系列,然后对level=0上的数据帧进行分组,并应用to_dict函数以创建每ID条记录

s = df.set_index('ID')
s.columns = s.columns.str.split(r'(?=\d+$)', expand=True)
s.stack().groupby(level=0).apply(pd.DataFrame.to_dict, 'records').reset_index(name='Z')

结果

   ID                                                                 Z
0  AA  [{'A': 1.0, 'B': 3.0, 'C': 6.0}, {'A': 4.0, 'B': 0.0, 'C': 6.0}]
1  BB  [{'A': 5.0, 'B': 5.0, 'C': 4.0}, {'A': 6.0, 'B': 7.0, 'C': 9.0}]
2  CC                                  [{'A': 5.0, 'B': 5.0, 'C': 5.0}]

Json相关问答推荐

合并二维数组的Jolt表达式

如何使用PlayWriter循环访问JSON对象

Golang返回的JSON顶级字段是可变的.如何在 struct 中使用

给定一个包含两个数组的JSON输入文件,如何使用Jolt将一个数组中的每个元素与另一个数组组合在一起?

当由.sh脚本执行时,AWS查询字符串不会提取任何数据

如何在 Apps 脚本中循环遍历 JSON 响应

如何通过 jolt 将一个对象中的键和值添加到数组中的每个对象中

如何从 json 中获取单个元素?

如何在 jQuery 中循环遍历 JSON 数组?

如何一次加载无限滚动中的所有条目以解析python中的HTML

json.dumps 打乱了顺序

使用 JSON 的 javascript 深拷贝

消息通知产生此内容无法显示

在视图中将 .Net 对象转换为 JSON 对象

Java循环遍历Json数组?

如何按键查找特定的 JSON 值?

JSON日期到Java日期?

Newtonsoft 对象 → 获取 JSON 字符串

如果键可能不存在,则从 Python dict 读取

如何将字符串转换为 JsonObject