来自单个CSV文件源的多个列表推导

时间:2018-10-28 20:53:52

标签: python pandas csv list-comprehension

我正在尝试使用列表推导来从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进行此操作,但结果却相同。

我很困惑为什么列表推导在这种配置下不起作用。

谁能解释为什么这行不通,或建议其他尝试方法?

谢谢

1 个答案:

答案 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对象(代表行的命名元组的迭代器),该对象可以被迭代一次。因此,您必须为每个列表理解secsvalsnano创建一个新的列表。