使用pandas模块从CSV赋值数组

0 投票
2 回答
4289 浏览
提问于 2025-04-18 10:24

如果我有一个包含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

不过你似乎已经知道这些了。

撰写回答