【问题标题】:Create pandas Dataframe from list of objects从对象列表创建熊猫数据框
【发布时间】:2020-12-20 21:34:14
【问题描述】:

我有以下代码:

import numpy as np
import pandas as pd

class my_class:
    def __init__(self, vector, par1, par2, par3):
        self.vector = vector  # this is a 1D numpy object.
        self.label = '({}, {}, {})'.format(par1, par2, par3)

obj1 = my_class(np.array([0, 1, 2, 3]), 4, -8, 7)
obj2 = my_class(np.array([6, 7, 8, 9]), 10, 4, 15)
obj3 = my_class(np.array([-1, -2, 3, -4]), 9, 3, 6)
obj4 = my_class(np.array([-10, -15, -20, 3]), 1, -2, 6)

my_list_of_objects = [obj1, obj2, obj3, obj4]

df = pd.DataFrame([o.__dict__ for o in my_list_of_objects])
print(df)

这是我得到的当前结果:

               vector        label
0        [0, 1, 2, 3]   (4, -8, 7)
1        [6, 7, 8, 9]  (10, 4, 15)
2     [-1, -2, 3, -4]    (9, 3, 6)
3  [-10, -15, -20, 3]   (1, -2, 6)

我想获得以下 pandas 数据框:

   (4, -8, 7)   (10, 4, 15)   (9, 3, 6)   (1, -2, 6)
0       0            6           -1          -10
1       1            7           -2          -15
2       2            8            3          -20
3       3            9           -4            3

在类中可以看到,属性标签有需要使用的对应列的名称。

【问题讨论】:

    标签: python pandas numpy dataframe dictionary


    【解决方案1】:

    使用unstack 并从中构造一个新的数据框

    df_final = pd.DataFrame.from_dict(df.set_index('label').unstack().droplevel(0)
                                                                     .to_dict())
    

    或者从labelvector 构造一个字典并将其传递给数据帧构造函数

    df_final = pd.DataFrame.from_dict(dict(df[['label', 'vector']].to_numpy()))
    
    Out[267]:
       (4, -8, 7)  (10, 4, 15)  (9, 3, 6)  (1, -2, 6)
    0           0            6         -1         -10
    1           1            7         -2         -15
    2           2            8          3         -20
    3           3            9         -4           3
    

    【讨论】:

      【解决方案2】:

      试试这个:

      df.set_index('label').T.apply(pd.Series.explode).reset_index(drop=True)
      

      输出:

      label (4, -8, 7) (10, 4, 15) (9, 3, 6) (1, -2, 6)
      0              0           6        -1        -10
      1              1           7        -2        -15
      2              2           8         3        -20
      3              3           9        -4          3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-14
        • 2021-06-08
        • 2017-08-27
        • 2021-09-29
        • 1970-01-01
        • 1970-01-01
        • 2020-09-21
        • 1970-01-01
        相关资源
        最近更新 更多