python - 数据框到字典,包括字典列表
问题描述
我正在尝试将以下数据框转换为字典。我想通过 A 列进行分组并列出常见序列。例如
示例 1:
n1 v1 v2
2 A C 3
3 A D 4
4 A C 5
5 A D 6
预期输出:
{'A': [{'C':'3','D':'4'},{'C':'5','D':'6'}]}
示例 2:
n1 n2 v1 v2
s1 A C 3
s1 A D 4
s1 A C 5
s1 A D 6
s1 B P 6
s1 B Q 3
预期输出:
{'s1': {'A': [{'C': 3, 'D': 4}, {'C': 5, 'D': 6}], 'B': {'P': 6, 'Q': 3}}}
所以基本上C
并D
作为一个序列重复,我想在一本字典中加入俱乐部C
,并D
列出它是否多次出现。
请注意(目前我正在使用以下代码):
def recur_dictify(frame):
if len(frame.columns) == 1:
if frame.values.size == 1: return frame.values[0][0]
return frame.values.squeeze()
grouped = frame.groupby(frame.columns[0])
d = {k: recur_dictify(g.iloc[:,1:]) for k,g in grouped}
return d
这返回:
{s1 : {'A': {'C': array(['3', '5'], dtype=object), 'D': array(['4', '6'], dtype=object),'B':{'E':'5','F':'6'}}
此外,可能还有另一系列s2
具有E,F,G,E,F,G
重复的和一些X
具有Y
单一值的
解决方案
让我们创建一个函数,该函数dictify
创建一个字典,其中包含来自列的顶级键name
和俱乐部的列中重复出现的值v1
到不同的子字典中:
from collections import defaultdict
def dictify(df):
dct = defaultdict(list)
for k, g in df.groupby(['n1', df.groupby(['n1', 'v1']).cumcount()]):
dct[k[0]].append(dict([*g[['v1', 'v2']].values]))
return dict(dct)
dictify(df)
{'A': [{'C': 3, 'D': 4}, {'C': 5, 'D': 6}]}
更新:
如果主分组键数量可变,即我们可以使用更通用的方法:[n1, n2, ...]
def update(dct, keys, val):
k, *_ = keys
dct[k] = update(dct.get(k, {}), _, val) if _ \
else [*np.hstack([dct[k], [val]])] if k in dct else val
return dct
def dictify(df, keys):
dct = dict()
for k, g1 in df.groupby(keys):
for _, g2 in g1.groupby(g1.groupby('v1').cumcount()):
update(dct, k, dict([*g2[['v1', 'v2']].values]))
return dict(dct)
dictify(df, ['n1', 'n2'])
{'s1': {'A': [{'C': 3, 'D': 4}, {'C': 5, 'D': 6}], 'B': {'P': 6, 'Q': 3}}}
推荐阅读
- python - *= 数组和整数之间的乘数问题
- c++ - 循环中的向量 (CPP) 打印问题
- spring-boot - 如何修复枚举的休眠“findBy”输入?
- python - 在这个 while 循环条件下发生了什么?
- flutter - 提供者,将其分配给变量和直接使用它有什么区别?
- python - Beautifulsoup 的 Python 抓取问题
- ios - 如何在将其转换为 Double 之前检查字符串值是否为 nil
- reactjs - 为什么react useQuery() 在突变后不获取最新数据?
- mysql - Laravel 7.4 无法添加外键约束
- kubernetes - Kubernetes中如何定义微服务自注册地址给consul