Python:从 DataFrame 中的两列创建结构化 numpy 结构化数组

标签 python arrays pandas numpy dataframe

如何从 DataFrame 中的两列创建结构化数组? 我试过这个:

df = pd.DataFrame(data=[[1,2],[10,20]], columns=['a','b'])
df

    a   b
0   1   2
1   10  20

x = np.array([([val for val in list(df['a'])],
               [val for val in list(df['b'])])])

但这给了我这个:

array([[[ 1, 10],
        [ 2, 20]]])

但我想要这个:

[(1,2),(10,20)]

谢谢!

最佳答案

有两种方法。与常规 NumPy 数组相比,您可能会遇到性能和功能方面的损失。

记录数组

您可以使用 pd.DataFrame.to_records使用 index=False。从技术上讲,这是一个 record array , 但对于许多用途来说,这就足够了。

res1 = df.to_records(index=False)

print(res1)

rec.array([(1, 2), (10, 20)], 
          dtype=[('a', '<i8'), ('b', '<i8')])

结构化数组

手动地,您可以通过按行转换为 tuple 来构建结构化数组,然后为 dtype 参数指定元组列表。

s = df.dtypes
res2 = np.array([tuple(x) for x in df.values], dtype=list(zip(s.index, s)))

print(res2)

array([(1, 2), (10, 20)], 
      dtype=[('a', '<i8'), ('b', '<i8')])

有什么区别?

很少。 recarray 是常规 NumPy 数组类型 ndarray 的子类。另一方面,第二个示例中的结构化数组是 ndarray 类型。

type(res1)                    # numpy.recarray
isinstance(res1, np.ndarray)  # True
type(res2)                    # numpy.ndarray

主要区别在于记录数组有助于属性查找,而结构化数组会产生AttributeError:

print(res1.a)
array([ 1, 10], dtype=int64)

print(res2.a)
AttributeError: 'numpy.ndarray' object has no attribute 'a'

相关:NumPy “record array” or “structured array” or “recarray”

关于Python:从 DataFrame 中的两列创建结构化 numpy 结构化数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51279973/

相关文章:

python - 尽管有 forms.PasswordInput 声明,但 Django 密码字段输入显示为纯文本

python - 斐波那契数列的递归

python - 用于热图的 pandas 数据透视表

python - 带有另一列索引的 Pandas 切片字符串

python - Pandas 沿着多索引和单独的索引切片

python - Pandas (Python)中的 "Anti-merge"

Python:如何编写 CSV 文件?

javascript - 通过仅包含数组属性子集的对象过滤 javascript 数组

java - 在java中将二进制文件转换为字节数组?

ios - 如何从 Swift 中的数组中删除给定自定义类型值的元素