【问题标题】:Transform column of dictionaries into a single pandas DataFrame将字典列转换为单个 pandas DataFrame
【发布时间】:2019-10-27 04:53:48
【问题描述】:

我有一个与此类似的数据框:

                     data
0                    [{'v': 10, 'n': 'metric2'}]
27   [{'v': 20, 'n': 'metric1'}, {'v': 56, 'n': 'metric3'}]
51                   [{'v': 20, 'n': 'metric3'}]
89                   [{'v': 10, 'n': 'metric2'}]

我想把它变成这样的东西:

    metric1 metric2 metric3
0   NaN     10     NaN
27  20      NaN    56
51  NaN     NaN    20
89  NaN     10     NaN

我想知道这是否可能?

【问题讨论】:

    标签: python pandas dataframe dictionary


    【解决方案1】:

    有多个apply的性能不好的解决方案,如果你有相对大的数据,你应该使用cs95提供的方法

    s.apply(pd.Series).stack().apply(pd.Series).set_index('n',append=True).v.unstack('n').sum(level=0)
    Out[86]: 
    n   metric1  metric2  metric3
    0       0.0     10.0      0.0
    27     20.0      0.0     56.0
    51      0.0      0.0     20.0
    89      0.0     10.0      0.0
    

    【讨论】:

    • 它可以完成这项工作,但正如您所建议的,我的数据集是 200k+ 条目,因此 cs95 的解决方案更快。还是谢谢!
    【解决方案2】:

    这是一个基于pivot 的解决方案,具有一定程度的扁平化。

    from itertools import chain
    
    df2 = pd.DataFrame(chain.from_iterable(df['data']))
    df2.insert(0, 'idx', df.index.repeat(df['data'].str.len()))
    
    df2.pivot(*df2)
    
    n    metric1  metric2  metric3
    idx                           
    0        NaN     10.0      NaN
    27      20.0      NaN     56.0
    51       NaN      NaN     20.0
    89       NaN     10.0      NaN
    

    在一行中,此操作可以用, 指定,

    (pd.DataFrame(chain.from_iterable(df['data']))
       .assign(idx=df.index.repeat(df['data'].str.len()))
       .pivot('idx', 'n', 'v'))
    
    n    metric1  metric2  metric3
    idx                           
    0        NaN     10.0      NaN
    27      20.0      NaN     56.0
    51       NaN      NaN     20.0
    89       NaN     10.0      NaN
    

    【讨论】:

    • 这太棒了,而且运行速度非常快,非常感谢。
    猜你喜欢
    • 2014-01-05
    • 2021-11-28
    • 1970-01-01
    • 2021-11-08
    • 2017-12-26
    • 2014-12-30
    相关资源
    最近更新 更多