如何按列 header 从 csv 中提取数据
How to extract data from csv by column header
我有要分析和绘制图表的 csv 文件(制表符分隔)。我可以从文件中提取数据,但我更愿意使用列 header 名称而不是普通索引来完成。
即代替:
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)
使用库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 : 整数或整数列表,默认‘infer’
用作列名的行号和数据的开头。默认行为是推断列名:如果没有传递名称,则行为与 header=0 相同,并且从文件的第一行推断出列名,如果显式传递列名,则行为相同到 header=None。显式传递 header=0 以能够替换现有名称。 header 可以是整数列表,指定列上 multi-index 的行位置,例如[0,1,3]。将跳过未指定的中间行(例如,跳过此示例中的 2)。请注意,如果 skip_blank_lines=True,此参数将忽略注释行和空行,因此 header=0 表示数据的第一行而不是文件的第一行。
名称:array-like,默认 None
要使用的列名列表。如果文件不包含 header 行,那么您应该显式传递 header=None。此列表中的重复项将导致发出 UserWarning。"
我有要分析和绘制图表的 csv 文件(制表符分隔)。我可以从文件中提取数据,但我更愿意使用列 header 名称而不是普通索引来完成。
即代替:
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)
使用库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 : 整数或整数列表,默认‘infer’
用作列名的行号和数据的开头。默认行为是推断列名:如果没有传递名称,则行为与 header=0 相同,并且从文件的第一行推断出列名,如果显式传递列名,则行为相同到 header=None。显式传递 header=0 以能够替换现有名称。 header 可以是整数列表,指定列上 multi-index 的行位置,例如[0,1,3]。将跳过未指定的中间行(例如,跳过此示例中的 2)。请注意,如果 skip_blank_lines=True,此参数将忽略注释行和空行,因此 header=0 表示数据的第一行而不是文件的第一行。
名称:array-like,默认 None
要使用的列名列表。如果文件不包含 header 行,那么您应该显式传递 header=None。此列表中的重复项将导致发出 UserWarning。"