熊猫数据帧行到列表字典,使用每行的第一个值作为键

zab*_*bop 3 python dictionary dataframe python-3.x pandas

import pandas as pd
Run Code Online (Sandbox Code Playgroud)

设置

我有一个数据框:

df = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                   'B': ['B0', 'B1', 'B2', 'B3'],
                   'C': ['C0', 'C1', 'C2', 'C3'],
                   'D': ['D0', 'D1', 'D2', 'D3']},
                   index=[0, 1, 2, 3])
Run Code Online (Sandbox Code Playgroud)

IE:

+----+-----+-----+-----+-----+
|    | A   | B   | C   | D   |
|----+-----+-----+-----+-----|
|  0 | A0  | B0  | C0  | D0  |
|  1 | A1  | B1  | C1  | D1  |
|  2 | A2  | B2  | C2  | D2  |
|  3 | A3  | B3  | C3  | D3  |
+----+-----+-----+-----+-----+
Run Code Online (Sandbox Code Playgroud)

(使用print(tabulate(df, headers='keys', tablefmt='psql')),相关 Q )


问题

我想将上面的数据帧转换为这个字典:

{'A0': ['A0', 'B0', 'C0', 'D0'],
 'A1': ['A1', 'B1', 'C1', 'D1'],
 'A2': ['A2', 'B2', 'C2', 'D2'],
 'A3': ['A3', 'B3', 'C3', 'D3']}
Run Code Online (Sandbox Code Playgroud)

每行的第一个元素是键,数据帧的行是作为列表的字典的值。


解决方案

A Using .iterrows(),这似乎是不好的做法

`{row[1][0]: list(row[1]) for row in df.iterrows() for alias in row[1]}`
Run Code Online (Sandbox Code Playgroud)

B 使用.groupby() (和这个)

gbdict=df.groupby('A').apply(lambda row: row.to_dict(orient='row')).to_dict()
{key: list(gbdict[key][0].values()) for key in gbdict.keys()}
Run Code Online (Sandbox Code Playgroud)

它们都产生所需的输出。


有没有更有效的方法来实现上述目标?

如果有没有for 循环的方法,即dict comprehension,那就太好了。

Shu*_*rma 5

使用set_index然后agg使用listonaxis=1并使用Series.to_dict

dct = df.set_index(df['A']).agg(list, axis=1).to_dict()
Run Code Online (Sandbox Code Playgroud)

结果:

{'A0': ['A0', 'B0', 'C0', 'D0'],
 'A1': ['A1', 'B1', 'C1', 'D1'],
 'A2': ['A2', 'B2', 'C2', 'D2'],
 'A3': ['A3', 'B3', 'C3', 'D3']}
Run Code Online (Sandbox Code Playgroud)


WeN*_*Ben 5

像这样的东西,我想这会比agg~快

yourdict = dict(zip(df.A,df.values.tolist()))
Out[123]: 
{'A0': ['A0', 'B0', 'C0', 'D0'],
 'A1': ['A1', 'B1', 'C1', 'D1'],
 'A2': ['A2', 'B2', 'C2', 'D2'],
 'A3': ['A3', 'B3', 'C3', 'D3']}
Run Code Online (Sandbox Code Playgroud)