【问题标题】:Dataframe to Dictionary including List of dictionaries数据框到字典,包括字典列表
【发布时间】:2020-12-28 14:40:30
【问题描述】:

我正在尝试将以下数据框转换为字典。 我想通过 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}}}

所以基本上CD 作为一个序列重复,我想将CD 放在一个字典中,并列出它是否多次出现。

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

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 重复,一些XY 有单个值

【问题讨论】:

  • 序列是否改变或总是包含CD
  • 嗨,请检查我更新的问题,您可能会更清楚

标签: python pandas list dataframe dictionary


【解决方案1】:

让我们创建一个函数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}}}

【讨论】:

  • 嗨,谢谢..我在下面发布另一个相关问题,请检查..实际上并没有必要多次出现..想给它一个 if 语句。
  • 刚刚,请检查
  • @PriyalMangla 这与上一个问题完全不同;)
  • 现在请检查我更新的问题.. 基本上它是动态的,具有更新序列的必须在列表中并且不重复不在列表中
  • 是的,是的,我知道,实际上这是我的实际问题,不能更早地提出它。但是非常感谢您的回答.. 我可以在某处使用此逻辑
【解决方案2】:

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

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')}

这是一个例子:

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

输出:

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

【讨论】:

  • 谢谢 :) ,我已经更新了我的问题,请检查一下?
猜你喜欢
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 2019-04-21
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 2020-02-04
相关资源
最近更新 更多