Pandas 数据框行到列表的字典,使用每行的第一个值作为键
Posted
技术标签:
【中文标题】Pandas 数据框行到列表的字典,使用每行的第一个值作为键【英文标题】:Pandas dataframe rows to dict of lists, using first value of each row as key 【发布时间】:2020-12-12 08:14:05 【问题描述】:import pandas as pd
设置
我有一个数据框:
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])
即:
+----+-----+-----+-----+-----+
| | A | B | C | D |
|----+-----+-----+-----+-----|
| 0 | A0 | B0 | C0 | D0 |
| 1 | A1 | B1 | C1 | D1 |
| 2 | A2 | B2 | C2 | D2 |
| 3 | A3 | B3 | C3 | D3 |
+----+-----+-----+-----+-----+
(使用print(tabulate(df, headers='keys', tablefmt='psql'))
、related Q)
问题
我想把上面的数据框转换成这个字典:
'A0': ['A0', 'B0', 'C0', 'D0'],
'A1': ['A1', 'B1', 'C1', 'D1'],
'A2': ['A2', 'B2', 'C2', 'D2'],
'A3': ['A3', 'B3', 'C3', 'D3']
每行的第一个元素是键,数据帧的行是作为列表的 dict 的值。
解决方案
一个
使用.iterrows()
,其中seems bad practice:
`row[1][0]: list(row[1]) for row in df.iterrows() for alias in row[1]`
B
使用.groupby()
(and this):
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()
它们都产生所需的输出。
问题
有没有更有效的方法来实现上述目标?
如果有办法without for 循环,即dict comprehension,那就太好了。
【问题讨论】:
【参考方案1】:这样的,我觉得会比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']
【讨论】:
【参考方案2】:使用set_index
然后agg
在list
上使用axis=1
并使用Series.to_dict
:
dct = df.set_index(df['A']).agg(list, axis=1).to_dict()
结果:
'A0': ['A0', 'B0', 'C0', 'D0'],
'A1': ['A1', 'B1', 'C1', 'D1'],
'A2': ['A2', 'B2', 'C2', 'D2'],
'A3': ['A3', 'B3', 'C3', 'D3']
【讨论】:
以上是关于Pandas 数据框行到列表的字典,使用每行的第一个值作为键的主要内容,如果未能解决你的问题,请参考以下文章
pandas筛选dataframe数据:获取dataframe的第二行到第N行的数据
pandas筛选dataframe数据:获取dataframe的第N行到第M行的前T列数据列的内容