首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“数据字典”,包括字典列表

“数据字典”,包括字典列表
EN

Stack Overflow用户
提问于 2020-09-10 06:27:39
回答 2查看 120关注 0票数 4

我正试图把下面的数据转换成字典。我想通过A列进行分组,并列出一个公共序列。例如:

示例1:

代码语言:javascript
复制
    n1 v1  v2 
2    A  C   3
3    A  D   4
4    A  C   5
5    A  D   6

预期输出:

代码语言:javascript
复制
{'A': [{'C':'3','D':'4'},{'C':'5','D':'6'}]}

示例2:

代码语言:javascript
复制
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

预期输出:

代码语言:javascript
复制
{'s1': {'A': [{'C': 3, 'D': 4}, {'C': 5, 'D': 6}], 'B': {'P': 6, 'Q': 3}}}

因此,基本上CD是作为一个序列重复的,我想把CD放在一个字典中,并列出如果发生了多次的话。

请注意(目前我正在使用以下代码):

代码语言:javascript
复制
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

这将返回:

代码语言:javascript
复制
{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重复,还有一些XY具有单个值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-10 07:22:20

让我们创建一个函数dictify,它从name列创建一个具有顶级键的字典,并将v1列中的值重复出现到不同的子词典中:

代码语言:javascript
复制
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)

代码语言:javascript
复制
dictify(df)

{'A': [{'C': 3, 'D': 4}, {'C': 5, 'D': 6}]}

更新:

如果有变量,主分组键的号,即[n1, n2, ...],我们可以使用更通用的方法:

代码语言:javascript
复制
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)

代码语言:javascript
复制
dictify(df, ['n1', 'n2'])

{'s1': {'A': [{'C': 3, 'D': 4}, {'C': 5, 'D': 6}], 'B': {'P': 6, 'Q': 3}}}
票数 4
EN

Stack Overflow用户

发布于 2020-09-10 07:27:06

下面是一个简单的一行语句,可以解决您的问题:

代码语言:javascript
复制
def df_to_dict(df):
    return {name: [dict(x.to_dict('split')['data'])
                   for _, x in d.drop('name', 1).groupby(d.index // 2)]
            for name, d in df.groupby('name')}

下面是一个示例:

代码语言:javascript
复制
df = pd.DataFrame({'name': ['A'] * 4,
                   'v1': ['C', 'D'] * 2,
                   'v2': [3, 4, 5, 6]})
print(df_to_dict(df))

输出:

代码语言:javascript
复制
{'A': [{'C': 3, 'D': 4}, {'C': 5, 'D': 6}]}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63823926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档