【问题标题】:Converting pandas dataframe to structured arrays将熊猫数据框转换为结构化数组
【发布时间】:2021-11-28 15:50:02
【问题描述】:

我有以下pandas 数据框

import pandas as pd
a = [2.5,3.3]
b = [3.6,3.9]
D = {'A': a, 'B': b}

这给了我类似的东西

+---+-----+-----+
|   |  A  |  B  |
+---+-----+-----+
| 0 | 2.5 | 3.3 |
| 1 | 3.6 | 3.9 |
+---+-----+-----+ 

我想将此数据帧转换为结构化数组,例如

data = np.rec.array([
('A', 2.5),
('A', 3.6),
('B', 3.3),
('B', 3.9),
], dtype = [('Type','|U5'),('Value', '<i8')])

由于我是 pandas 的新手,所以我未能找到实现这一目标的方法。我试过pd.to_records,但索引挡住了我找不到解决办法。

感谢任何帮助。谢谢。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    Melt the DataFrame 使AB(列索引)成为一列。 要摆脱数字索引,请将此新列设为索引。然后拨打to_records()

    import pandas as pd
    a = [2.5,3.3]
    b = [3.6,3.9]
    D = {'A': a, 'B': b}
    df = pd.DataFrame(D)
    result = (pd.melt(df, var_name='Type', value_name='Value')
              .set_index('Type').to_records())
    print(repr(result))
    

    产量

    rec.array([('A',  2.5), ('A',  3.3), ('B',  3.6), ('B',  3.9)], 
              dtype=[('Type', 'O'), ('Value', '<f8')])
    

    这是关键步骤:

    In [167]: df
    Out[167]: 
         A    B
    0  2.5  3.6
    1  3.3  3.9
    
    In [168]: pd.melt(df)
    Out[168]: 
      variable  value
    0        A    2.5
    1        A    3.3
    2        B    3.6
    3        B    3.9
    

    一旦你融化了 DataFrame,to_records(基本上)会返回所需的结果:

    In [169]: pd.melt(df).to_records()
    Out[169]: 
    rec.array([(0, 'A',  2.5), (1, 'A',  3.3), (2, 'B',  3.6), (3, 'B',  3.9)], 
              dtype=[('index', '<i8'), ('variable', 'O'), ('value', '<f8')])
    

    【讨论】:

    • 工作就像一个魅力。非常感谢@unutbu!
    【解决方案2】:
    np.rec.fromrecords(list(zip(df.melt().variable,df.melt().value)))
    Out[531]: 
    rec.array([('A',  2.5), ('A',  3.3), ('B',  3.6), ('B',  3.9)], 
              dtype=[('f0', '<U1'), ('f1', '<f8')])
    

    【讨论】:

      【解决方案3】:

      你可以融化并调用to_records:

      pd.melt(df).to_records(index=False)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 2020-09-08
        • 2019-04-04
        • 2021-08-21
        • 1970-01-01
        相关资源
        最近更新 更多