繁体   English   中英

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

[英]Python: Create structured numpy structured array from two columns in a 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阵列,您可能会遇到性能和功能损失。

记录数组

您可以使用index=False pd.DataFrame.to_records 从技术上讲,这是一个记录阵列 ,但出于许多目的,这就足够了。

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是的子类ndarray ,常规NumPy的阵列型。 另一方面,第二个例子中的结构化数组是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“记录数组”或“结构化数组”或“重新排列”

使用list comprehension将嵌套list转换为tuple

print ([tuple(x) for x in df.values.tolist()])
[(1, 2), (10, 20)]

细节

print (df.values.tolist())
[[1, 2], [10, 20]]

编辑:你可以转换为to_records然后转换为np.asarray ,检查链接

df = pd.DataFrame(data=[[True, 1,2],[False, 10,20]], columns=['a','b','c'])
print (df)
       a   b   c
0   True   1   2
1  False  10  20

print (np.asarray(df.to_records(index=False)))
[( True,  1,  2) (False, 10, 20)]

这是一个单行:

list(df.apply(lambda x: tuple(x), axis=1))

要么

df.apply(lambda x: tuple(x), axis=1).values

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM