使用pandas模块从CSV赋值数组
如果我有一个包含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)
我希望数组headers中的每个元素都能成为对应数据数组的变量名(它们是按顺序排列的)。我想用一行代码来实现这个,这样下一行我就可以说,比如,test = headername1 * headername2。
2 个回答
1
我觉得我明白你的意思了,你想用一个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
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
不过你似乎已经知道这些了。