通过列名为数据框的每一列创建数组

1 投票
3 回答
1540 浏览
提问于 2025-04-18 14:46

我想创建一些数组,这些数组的名字和一个大数据表中每一列的名字相对应。我希望每个数组的名字和它对应的列名是一样的。下面是我尝试的方法:

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.adf['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]

撰写回答