如何在Python中调用具有列名的列

时间:2014-11-12 18:31:57

标签: python csv pandas multiple-columns

我有数百个csv文件。每个人不必像下面那样拥有相同的标题。

CSV1:
G,B,C,D
1,2,3,4
2,4,5,6

CSV2:
A,C,D
1,2,6
2,5,7

我想按名称调用每一列,如下所示: 如果文件有列A:选择该列 else:跳到下一个必需列(可能是B)并对每个文件重复相同的过程,直到引用了所有必需的列。如果你能帮我这么做,我真的很感激。

4 个答案:

答案 0 :(得分:0)

解决方案1:使用csv模块的DictReader

解决方案2:如果您的数据确实是数字,如您的示例所示,您可以使用numpy.genfromtxt生成结构化数组:http://docs.scipy.org/doc/numpy/user/basics.rec.html

答案 1 :(得分:0)

使用所需的列名称调用以下函数,并返回属于此列的所有值的列表:

import csv

file = 'c:\\temp\\test.csv'

def GetValuesFromColumn(title):

  values = []
  rownum = 0
  with open(file, 'r') as f:
    reader = csv.reader(f)
    for row in reader:
      if rownum == 0:
        index = row.index(title)
        rownum = 1
      else:
        values.append(row[index])

  return values

values = GetValuesFromColumn('D')

答案 2 :(得分:0)

如果你喜欢熊猫的方法,这里有一个选择。它打开每个文件,抓取一行,查看列并查看是否有任何列名称在所需列表中。如果我们想要任何列,则将csv读入Pandas DataFrame

示例数据:

df = pd.DataFrame( [(2014, 30, 15), (2015, 10, 20), (2007, 5, 3)] )
df.columns = ['year','a','b']
df.set_index('year', inplace=True)
df.to_csv('tst.csv')
df.columns  = ['c','z']
df.to_csv('tst2.csv')

做好工作:

导入glob

wanted = ['year','a','z']
path = '.'
allFiles = glob.glob(path + "/*.csv")
for file in allFiles:
    #grab only one row for testing
    df = pd.read_csv(file, nrows=1)
    includedCols = []
    for x in wanted:
        if x in df.columns:
            includedCols.append(x) 
    if len(includedCols) > 0:
        df = pd.read_csv(file, usecols = includedCols)
        print df
        ## do something with df here

答案 3 :(得分:0)

使用csv.DictReader()

  

创建一个像普通读者一样操作的对象,但将读取的信息映射到一个字典,其中的键由可选的fieldnames参数给出。

     

如果省略fieldnames参数,则csvfile第一行中的值将用作字段名。

例如

import csv
def get_values_for_column(csvfile, col):
    with open(csvfile, 'rb') as f:
        reader = csv.DictReader(f)
        values = [row[col] for row in reader]
        return values

# Usage
>> get_values_for_column('CSV1.csv', 'D')
# prints [4, 6]

根据Alan和Aldervan的答案