根据值的位置从多个列创建字典

Cle*_*leb 4 python performance dictionary pandas

我有一个像这样的数据框

import pandas as pd

df = pd.DataFrame(
    {
        'C1': list('aabbab'),
        'C2': list('abbbaa'),
        'value': range(11, 17)
    }
)

  C1 C2  value
0  a  a     11
1  a  b     12
2  b  b     13
3  b  b     14
4  a  a     15
5  b  a     16
Run Code Online (Sandbox Code Playgroud)

我想生成这样的字典:

{'C1': {'a': {1: 11, 2: 12, 3: 15}, 'b': {1: 13, 2: 14, 3: 16}},
'C2': {'a': {1: 11, 2: 15, 3: 16}, 'b': {1: 12, 2: 13, 3: 14}}}
Run Code Online (Sandbox Code Playgroud)

逻辑如下:

df我转到该列C1中,我在该列中找到的第一个a对应于 value 11,第二个对应于 value 12,第三个对应于15。和相应值的位置应存储在键和a的字典中。C1a

我可以做这样的事情

df_ss = df.loc[df['C1'] == 'a', 'value']
d = {ind: val for ind, val in enumerate(df_ss.values, 1)}
Run Code Online (Sandbox Code Playgroud)

其结果为d

{1: 11, 2: 12, 3: 15}
Run Code Online (Sandbox Code Playgroud)

这确实是所需的输出。然后我可以将其放入循环中并生成所有必需的字典。

有没有人看到比这更有效的东西?

Ale*_*lex 5

您可以使用 groupby 和嵌套字典理解:

import pandas as pd

df = pd.DataFrame(
    {
        'C1': list('aabbab'),
        'C2': list('abbbaa'),
        'value': range(11, 17)
    }
)

d = {
    c: {k: dict(enumerate(g["value"], 1)) for k, g in df.groupby(c)}
    for c in ["C1", "C2"]
}
Run Code Online (Sandbox Code Playgroud)

哪个输出:

{'C1': {'a': {1: 11, 2: 12, 3: 15}, 'b': {1: 13, 2: 14, 3: 16}},
 'C2': {'a': {1: 11, 2: 15, 3: 16}, 'b': {1: 12, 2: 13, 3: 14}}}
Run Code Online (Sandbox Code Playgroud)