使用pandas模块从CSV分配数组

时间:2014-06-19 17:36:31

标签: python python-2.7 csv pandas

如果我有一个100+列的文件,如何将每列放入一个数组,由列标题引用,而不必执行header1 = [1,2,3],header2 = ['a', 'b','c'],依此类推......?

这是我目前所拥有的,其中headers是标题名称的列表:

import pandas as pd

data = []
df = pd.read_csv('outtest.csv')
for i in headers:
    data.append(getattr(df, i).values)

我希望数组头的每个元素都是数据中相应数据数组的变量名(它们按顺序排列)。不知何故,我想要一行这样做,以便我可以说下一行,例如,test = headername1 * headername2。

2 个答案:

答案 0 :(得分:2)

import pandas as pd

如果标题位于csv文件中,我们可以使用:

df = pd.read_csv('outtest.csv')

如果csv文件中没有标题:

headers = ['list', 'of', 'headers']
df = pd.read_csv('outtest.csv', header=None, names=headers)

假设headername1和headername2是常数:

test = df.headername1 * df.headername2

或者

test = df['headername1'] * df['headername2']

假设它们是可变的:

test = df[headername1] * df[headername2]

默认情况下,这种访问形式返回pd.Series,通常可以与numpy互操作。您可以使用.values显式获取值:

df[headername1].values

但你似乎已经知道了这一点。

答案 1 :(得分:0)

我想我知道你要去做什么,所以使用StringIO对象来模拟文件对象作为设置:

import pandas as pd 
import StringIO

txt = '''foo,bar,baz
1, 2, 3
3, 2, 1'''
fileobj = StringIO.StringIO(txt)

这是您想要的大致代码:

data = []
df = pd.read_csv(fileobj)
for i in df.columns:
    data.append(df[i])

for i in data: 
    print i

打印

0    1
1    3
Name: foo
0    2
1    2
Name: bar
0    3
1    1
Name: baz