【问题标题】:Pandas data frame creation inconsistenciesPandas 数据框创建不一致
【发布时间】:2025-12-06 20:25:01
【问题描述】:

我正在从 python 字典创建一个 pandas 数据框:

import numpy as np
import pandas as pd

obs_dict = {
            'pos':[[0,0],[10,10]],
            'vel':[[0,0],[0,0]],
            'mass':np.array([10000,10000])
           }

print pd.DataFrame(obs_dict)

返回:

    mass       pos     vel
0  10000    [0, 0]  [0, 0]
1  10000  [10, 10]  [0, 0]

请注意,我在位置 ('pos') 和速度 ('vel') 列中有一个二维列表作为项目。但是,当我用 2d numpy 数组替换 2d 列表时:

obs_dict = {
            'pos':np.array([[0,0],[10,10]]),
            'vel':np.array([[0,0],[0,0]]),
            'mass':np.array([10000,10000])
           }

我得到一个例外:

Exception: Data must be 1-dimensional

不幸的是,我使用的数据包含在一个 numpy 数组中,我不想将其转换为 python 列表,有什么办法可以做到这一点吗?

【问题讨论】:

  • 列表列表与二维 numpy 数组不同,我想您需要 np.array([[0,0],[10,10]]).tolist() 才能获得与列表相同的行为
  • 您希望将什么存储为列值?基本上,尝试存储二维数组是行不通的,因为 ctor 将检查您发现的尺寸,以下工作但我不知道这是否是您想要的:obs_dict = { 'pos':[np.array([[0,0],[10,10]])], 'vel':[np.array([[0,0],[0,0]])], 'mass':[np.array([10000,10000])] }
  • @EdChum 这导致只有一行,我想要两行(每个位置、速度和质量一个)
  • @PadraicCunningham 这只是一个测试用例,真正的代码将有超过 10000 个速度、质量和位置,所以 tolist() 将是一个主要的减速
  • 在尝试了一些技巧之后,我认为这无法做到,我从未见过存储多维 np 数组的系列,我只见过单独的列二维数组,所以我建议你把它看成一个结构

标签: python arrays numpy pandas


【解决方案1】:

在这段代码中:

obs_dict = {
        'pos':[[0,0],[10,10]],
        'vel':[[0,0],[0,0]],
        'mass':np.array([10000,10000])
       }
print pd.DataFrame(obs_dict)`

你刚刚得到一个包含一些对象列的数据框,试试 dtypes:

tt = pd.DataFrame(obs_dict)
tt.dtypes

显示:

mass     int64
pos     object
vel     object
dtype: object

我不认为这是可以做到的。

【讨论】: