我正在尝试创建一些与大数据框中每列的数据值相对应的数组,并且我希望每个数组与其对应的列共享相同的名称。以下是我试图解决这个问题的一个例子:
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]
如何解决此问题?
答案 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])
如果您事先不知道列名,则可以创建一个字典,其中字典中的每个键值对都是name
:array
。最简单的方法是
arrays = dict(df.iteritems())
或者如果您不想索引:
arrays = dict(zip(df.columns, df.as_matrix().T))
然后您可以通过名称arrays['a']
检索数组。但是,我不确定为什么您希望此功能能够通过调用df.a
或df['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.])