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
的字典中。C1
a
我可以做这样的事情
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)
这确实是所需的输出。然后我可以将其放入循环中并生成所有必需的字典。
有没有人看到比这更有效的东西?
您可以使用 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)