【问题标题】:How to extract data from csv by column header如何按列标题从csv中提取数据
【发布时间】:2020-01-31 08:27:08
【问题描述】:

我有要分析和绘制图表的 csv 文件(制表符分隔)。我可以从文件中提取数据,但我更喜欢使用列标题名称而不是普通索引。

即代替:

freq_data = my_data[:,0]

我会使用类似的东西:

freq2_data=dataA['Freq']

这只会给我那一列数据,而顶部字段没有“nan”。我想这样做,以防某些人对数据的排序不同。

我目前拥有的是:

import os
import csv
import numpy as np
from numpy import genfromtxt

def mylistdir(directory):
    """A specialized version of os.listdir() that ignores files that
    start with a leading period."""
    filelist = os.listdir(directory)
    return [x for x in filelist
            if not (x.startswith('.'))]
path = ("C:\\Users\\priper\\Desktop\\rough_data\\")
results_files = mylistdir(path)
print(results_files)


vel_data = []

for f in results_files:
    f = path + f
    my_data = np.genfromtxt(f, dtype = float, delimiter='\t') #, names = True, max_rows=1
    print(my_data)
    freq_data = my_data[:,0]
    height_data = my_data[:,1]
    width_data = my_data[:,2]
    time_data = my_data[:,3]
    freq2_data=dataA['Freq']
    print(width_data)
    print(freq2_data)

关于我能做什么的任何想法?

csv 文件:

Freqheight_cmsWidth_cmsTime_secs
"998.2121573301549  44.08897100772889   6.445672191528545   90.0"
"998.2121573301549  46.34952337794475   6.49171270718232    90.0"
"998.2121573301549  39.7907973252776    6.49171270718232    90.0"
"1999.404052443385  42.986804623146725  6.445672191528545   90.0"
"1999.404052443385  38.76177273904744   6.49171270718232    90.0"
"1999.404052443385  46.34952337794475   6.491875969369261   89.59365376669096"
"2997.61620977354   44.08897100772889   6.491875969369261   89.59365376669096"
"2997.61620977354   42.986804623146725  6.537915335317934   89.59651526494126"
"2997.61620977354   44.08897100772889   6.49171270718232    90.0"
"3998.80810488677   47.50820176059876   6.307550644567219   90.0"
"3998.80810488677   46.34952337794475   6.3535911602209945  90.0"
"3998.80810488677   41.903151251584184  6.3997972870975675  89.58780725859766"
"5000.0 38.76177273904744   6.21564013134898    89.57559458063852"
"5000.0 44.08897100772889   6.261510128913444   90.0"
"5000.0 41.903151251584184  6.2616793932272925  89.57871509583141"
"5998.212157330155  33.881963382336906  6.077522459688805   89.5659493678606"
"5998.212157330155  47.50820176059876   5.985444111277719   89.55927192723898"
"5998.212157330155  53.59203690324092   6.123388581952118   90.0"

在仔细阅读下面用户给出的答案和提示后,这是有效的。

for f in results_files:
    f = path + f
    data = pd.read_csv(f, sep = '\t')
    length_of_data = len(data)
    print(data.head(length_of_data))
    freqy = data[['Freq']]
    print(freqy)

【问题讨论】:

  • @Windy71 使用 pandas 从 csv data = pd.read_csv("filename.csv") 加载数据,然后如果 csv 包含此类标题,您可以按列名访问您的列
  • @ZarakiKenpachi - 当我使用 data = pd.read_csv(f) 然后按标题索引 data = pd.read_csv(f) Freq_data = data[['Freq']] 我得到一个很长的错误消息 Keyerror :“[Index(['Freq'], dtype = 'object')] 均不在 [columns] 中”。我不知道那是什么意思。

标签: python numpy csv data-analysis genfromtxt


【解决方案1】:

使用库 pandas: https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.read_csv.html

import pandas as pd

my_csv = pd.read_csv(filepath, header, names)

"header : int 或 int 列表,默认为'infer'

用作列名的行号,以及数据的开头。默认行为是推断列名:如果未传递名称,则行为与 header=0 相同,并且从文件的第一行推断列名,如果显式传递列名,则行为与 header=None 相同.显式传递 header=0 以便能够替换现有名称。标题可以是一个整数列表,指定列上多索引的行位置,例如[0,1,3]。未指定的中间行将被跳过(例如,此示例中的 2 被跳过)。请注意,如果skip_blank_lines=True,此参数会忽略注释行和空行,因此header=0 表示数据的第一行而不是文件的第一行。

名称:类数组,默认无

要使用的列名列表。如果文件不包含标题行,则应显式传递 header=None。此列表中的重复项将导致发出 UserWarning。”

【讨论】:

    猜你喜欢
    • 2019-03-17
    • 1970-01-01
    • 2019-11-04
    • 2021-06-22
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    相关资源
    最近更新 更多