python - 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 来实现类似的效果?
解决方案
首先加入type
withdelta
以DataFrame.pop
使用和删除 column delta
,然后使用每个组的自定义 lambda 函数GroupBy.apply
来创建嵌套字典,最后通过Series.unstack
with重塑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,...
推荐阅读
- java - 字符串数组的第一个元素打印 null
- java - 从 CURL 转换的 Java HTTP POST 和 GET
- swift - 我无法弄清楚具有三种状态(启动、停止和重置)的 UIButton
- python - 如何使用 R 或 python 从 postgres bytea 列下载图像?
- java - 在 java.util.Arrays 类中找不到静态方法 asList(java.lang.String)
- c++ - 如何将 QML 模型更改为 C++ 模型?
- security - SSL 剥离攻击中实际发生的情况
- visual-studio-code - 如何阻止python linter(VSCode)切换导入顺序
- javascript - Phaser 3如何全屏显示
- python - 查找所有*不*匹配正则表达式的单词/子字符串?