按列名为数据框的每列创建数组

时间:2014-07-25 15:45:20

标签: python arrays numpy

我正在尝试创建一些与大数据框中每列的数据值相对应的数组,并且我希望每个数组与其对应的列共享相同的名称。以下是我试图解决这个问题的一个例子:

x = [a b c] <- column names
    [1 2 3]
    [1 2 3]

names = [a b c]

For i in names:

i = numpy.array(x[i])

我想创建三个数组(a,b和c):

a = [1, 1]
b = [2, 2]
c = [3, 3]

但我得到的只是一个阵列:

i = [3, 3]

如何解决此问题?

3 个答案:

答案 0 :(得分:1)

通过迭代,会发生以下情况:

i = 'a'
i = np.array([1, 1])
i = 'b'
i = np.array([2, 2])
i = 'c'
i = np.array([3, 3])

然后当你print i时,你只剩下你在迭代的 最后一步 中为i设置的内容。你可能想要这样的东西:

import pandas as pd
df = pd.DataFrame({'a':[1,1], 'b':[2,2], 'c':[3,3]})
a, b, c = [np.array(df[i]) for i in df.columns]

然后你得到

print a
#array([1, 1])
print b
#array([2, 2])
print c
#array([3, 3])

如果您事先不知道列名,则可以创建一个字典,其中字典中的每个键值对都是namearray。最简单的方法是

arrays = dict(df.iteritems())

或者如果您不想索引:

arrays = dict(zip(df.columns, df.as_matrix().T))

然后您可以通过名称arrays['a']检索数组。但是,我不确定为什么您希望此功能能够通过调用df.adf['a']来获得相同的功能。

答案 1 :(得分:1)

每次在for循环中,你都为同一个变量分配一个不同的值,所以当循环结束时,你将留下最后一个赋值。

我建议您创建一个字典,并将每个名称用作键,将数组用作值:

arrays = {}
for i in names:
    arrays[i] = numpy.array(x[i])

然后你可以用:

检索每个数组
arrays[name]

答案 2 :(得分:1)

仅使用NumPy,您可以使用结构化数组:

test = np.array([(1,2,3), (1,2,3), (1,2,3)], dtype=[('a', float), ('b', float), ('c', float)])

这样:

print(test['a'])
#array([ 1.,  1.,  1.])