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

时间:2018-07-11 07:48:45

标签: 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)]

谢谢!

3 个答案:

答案 0 :(得分:3)

有两种方法。与常规的NumPy阵列相比,您可能会在性能和功能上遭受损失。

记录数组

您可以将pd.DataFrame.to_recordsindex=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”

答案 1 :(得分:1)

使用列表推导将嵌套的list s转换为tuple s:

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,选中link

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)]

答案 2 :(得分:0)

这里是单线:

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

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