通过列名为数据框的每一列创建数组
我想创建一些数组,这些数组的名字和一个大数据表中每一列的名字相对应。我希望每个数组的名字和它对应的列名是一样的。下面是我尝试的方法:
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 个回答
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
如果你只用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.])
1
在for循环中,每次都会给同一个变量赋不同的值,所以当循环结束时,你得到的就是最后一次赋的值。
我建议你创建一个字典,用每个名字作为键,把数组作为值:
arrays = {}
for i in names:
arrays[i] = numpy.array(x[i])
这样你就可以用以下方式获取每个数组:
arrays[name]