我正在尝试使用列表推导来从CSV文件源获取特定的列。
以下是一些模拟我看到的CSV文件数据的代码:
import pandas as pd
import numpy as np
# Setup of simulated data
seconds = [1,2,3]
values = [0.5,0.4,0.3]
non_relevant_data = [8,6,7]
nanos = [5757,6767,7777]
dataset=list(zip(seconds,values,non_relevant_data,nanos))
df = pd.DataFrame(data=dataset)
df.to_csv('data.csv',index=False,header=False,name=None)
table=pd.read_csv('data.csv',header=None).itertuples(index=False,name=None)
这就是我想要做的:
# Getting each column in the table using list comprehensions
secs = np.array([row[0] for row in table])
vals = np.array([row[1] for row in table])
nano = np.array([row[3] for row in table])
print secs
print vals
print nano
结果如下:
[1 2 3]
[]
[]
如果我注释掉secs列表理解对象,并且不对vals和nano变量进行注释,则结果如下:
[0.5 0.4 0.3]
[]
如果我使用for循环并预定义secs,vals和nano数组,则可以使代码正常工作,但这不是很好。
我也尝试不使用numpy进行此操作,但结果却相同。
我很困惑为什么列表推导在这种配置下不起作用。
谁能解释为什么这行不通,或建议其他尝试方法?
谢谢
答案 0 :(得分:0)
尝试以下方法:
table=pd.read_csv('data.csv', header=None)
secs = np.array([row[0] for row in table.itertuples(index=False,name=None)])
vals = np.array([row[1] for row in table.itertuples(index=False,name=None)])
nano = np.array([row[3] for row in table.itertuples(index=False,name=None)])
您的版本无法正常运行的原因是因为itertuples
创建了一个zip对象(代表行的命名元组的迭代器),该对象可以被迭代一次。因此,您必须为每个列表理解secs
,vals
,nano
创建一个新的列表。