【问题标题】:numpy array with a list to pandas dataframe带有熊猫数据框列表的numpy数组
【发布时间】:2020-06-15 13:28:44
【问题描述】:

如何将以下 numpy 数组转换为 pandas 数据框。目前我得到一维异常。我尝试了 data.flatten() 但没有这样做。

array([ (1329865020L, 67, [84, 89, 80, 69, 32, 104, 116, 109, 108, 62, 10, 60, 104, 116, 109, 108, 32, 108, 97, 110, 103, 61, 34, 101]),
   (171844206L, 32, [32, 10, 32, 32, 10, 32, 32, 10, 32, 32, 10, 32, 32, 10, 32, 32, 60, 104, 101, 97, 100, 62, 10, 32]),
   (1008738336L, 109, [101, 116, 97, 32, 105, 100, 61, 34, 98, 98, 45, 98, 111, 111, 116, 115, 116, 114, 97, 112, 34, 32, 100, 97]),
   ...,
   (573317693L, 97, [112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 73, 68, 34, 58, 34, 49, 56, 52, 49, 50, 56, 52, 34, 44]),
   (1920099618L, 111, [114, 66, 101, 97, 99, 111, 110, 34, 58, 34, 98, 97, 109, 46, 110, 114, 45, 100, 97, 116, 97, 46, 110, 101]),
   (573317748L, 97, [112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 84, 105, 109, 101, 34, 58, 49, 54, 57, 125, 60, 47, 115, 99])], 
  dtype=[('ldr', '<u4'), ('ver', 'u1'), ('dat', 'u1', (24,))])

谢谢。 最好的问候

【问题讨论】:

  • 您的预期输出是什么?分享您已经尝试过的代码,以便我们了解错误所在。
  • 请改用 Python 3。Python 2 已被废弃,不再支持。 NumPy 或 Pandas 也不支持 Python 2。

标签: python arrays pandas numpy dataframe


【解决方案1】:

您的第三列将被 Pandas 视为二维数组,因此您会得到例外:Exception: Data must be 1-dimensional。

您可以强制 Pandas(和 NumPy)以不同的方式考虑该列,方法是将其转换为 Python 列表。然后,将结构化数组转换为 Pandas DataFrame 只需两步:

import numpy as np
import pandas as pd

a = np.array([ (1329865020, 67, [84, 89, 80, 69, 32, 104, 116, 109, 108, 62, 10, 60, 104, 116, 109, 108, 32, 108, 97, 110, 103, 61, 34, 101]),
   (171844206, 32, [32, 10, 32, 32, 10, 32, 32, 10, 32, 32, 10, 32, 32, 10, 32, 32, 60, 104, 101, 97, 100, 62, 10, 32]),
   (1008738336, 109, [101, 116, 97, 32, 105, 100, 61, 34, 98, 98, 45, 98, 111, 111, 116, 115, 116, 114, 97, 112, 34, 32, 100, 97]),
   (573317693, 97, [112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 73, 68, 34, 58, 34, 49, 56, 52, 49, 50, 56, 52, 34, 44]),
   (1920099618, 111, [114, 66, 101, 97, 99, 111, 110, 34, 58, 34, 98, 97, 109, 46, 110, 114, 45, 100, 97, 116, 97, 46, 110, 101]),
   (573317748, 97, [112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 84, 105, 109, 101, 34, 58, 49, 54, 57, 125, 60, 47, 115, 99])],
  dtype=[('ldr', '<u4'), ('ver', 'u1'), ('dat', 'u1', (24,))])

df = pd.DataFrame.from_records(a[['ldr', 'ver']])
df['dat'] = a['dat'].tolist()
print(df)
print(df.dtypes)

输出:

          ldr  ver                                                dat
0  1329865020   67  [84, 89, 80, 69, 32, 104, 116, 109, 108, 62, 1...
1   171844206   32  [32, 10, 32, 32, 10, 32, 32, 10, 32, 32, 10, 3...
2  1008738336  109  [101, 116, 97, 32, 105, 100, 61, 34, 98, 98, 4...
3   573317693   97  [112, 112, 108, 105, 99, 97, 116, 105, 111, 11...
4  1920099618  111  [114, 66, 101, 97, 99, 111, 110, 34, 58, 34, 9...
5   573317748   97  [112, 112, 108, 105, 99, 97, 116, 105, 111, 11...
ldr    uint32
ver     uint8
dat    object
dtype: object

【讨论】:

  • 第一列值不是int类型。将其转换为字符串后需要使用('ldr', 'S10') 格式。
  • @ArunAugustine 我不明白你的意思。请参阅我添加的打印 dtypes,这表明 ldr 和 ver 是整数类型。
  • 我只是指问题中的第一列值1329865020L。删除 L 现在对我来说听起来不错。
  • @ArunAugustine 这只是问题中的 Python 2 人工制品,表示这些值是长整数;这在问题的原始代码中甚至不是必需的,因为所有值都低于(1&lt;&lt;31)-1(底层C long 的最低要求最大值)。因此,无论是在我的代码中还是在问题本身的代码中,确实不需要任何字符串到/从整数转换。
  • 这个数组是由二进制数据构成的。第一列的值是从 4 个字节的数据中获得的。因此...感谢您的敏锐观察。你摇滚!
猜你喜欢
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 2019-12-20
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
相关资源
最近更新 更多