Python 数据帧到字典,包括字典列表

Python 数据帧到字典,包括字典列表,python,pandas,list,dataframe,dictionary,Python,Pandas,List,Dataframe,Dictionary,我正在尝试将下面的数据帧转换为字典。 我想通过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'}]} n1 n2 v1 v2 s1 A C 3 s1 A D 4 s1 A C 5 s1 A D 6 s1

我正在尝试将下面的数据帧转换为字典。 我想通过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'}]}
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}}}
预期输出:

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

示例2:

    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'}]}
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}}}
预期输出:

    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'}]}
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
合并到一个字典中,列出它是否出现多次

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

这将返回:

{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)

更新: 如果存在变量数量的主要分组键,即
[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)


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

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}]}

序列是否更改或始终包含
C
D
?您好,请检查我更新的问题,您可能会得到更多澄清您好,谢谢。。我在下面发布另一个相关问题,请查收。。实际上,多次出现并不是必须的。。我想为它做一个if声明。请现在就做check@PriyalMangla这与前一个问题完全不同;)现在请检查我更新的问题。。基本上它是动态的,那些更新了序列的必须在列表中,不重复,不在列表中是的,是的,我知道,实际上这是我的实际问题,不能很早地把它框起来。但是非常感谢你的回答。。我可以在某些地方使用这个逻辑,谢谢:),我已经更新了我的问题,请检查?