【问题标题】:Pandas dataframe rows to dict of lists, using first value of each row as keyPandas 数据框行到列表的字典,使用每行的第一个值作为键
【发布时间】: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,那就太好了。

【问题讨论】:

    标签: python python-3.x pandas dataframe dictionary


    【解决方案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 然后agglist 上使用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']}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-10
        • 1970-01-01
        • 2021-08-23
        • 2016-05-03
        • 2021-02-22
        • 2022-07-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多