选择第n行作为Pandas DataFrame,而不读取整个文件

时间:2018-12-17 09:17:39

标签: pandas dataframe time-series

我正在读取一个大文件,其中包含约950万行x 16列。

我有兴趣检索代表性样本,并且由于数据是按时间组织的,因此我想通过选择第500个元素来做到这一点。

我能够加载数据,然后选择第500行。

我的问题:是否可以立即读取第500个元素(使用.pd.read_csv()或其他方法),而不必先读取然后过滤数据?

问题2:如果未对date列进行排序,您将如何解决此问题?目前,我假设它是按日期排序的,但是所有数据都容易出错。

以下是数据的摘要(前五行)前四行乱序,其余数据集按时间顺序排序:

VendorID    tpep_pickup_datetime    tpep_dropoff_datetime   passenger_count trip_distance   RatecodeID  store_and_fwd_flag  PULocationID    DOLocationID    payment_type    fare_amount extra   mta_tax tip_amount  tolls_amount    improvement_surcharge   total_amount
0   1   2017-01-09 11:13:28 2017-01-09 11:25:45 1   3.30    1   N   263 161 1   12.5    0.0 0.5 2.00    0.00    0.3 15.30
1   1   2017-01-09 11:32:27 2017-01-09 11:36:01 1   0.90    1   N   186 234 1   5.0 0.0 0.5 1.45    0.00    0.3 7.25
2   1   2017-01-09 11:38:20 2017-01-09 11:42:05 1   1.10    1   N   164 161 1   5.5 0.0 0.5 1.00    0.00    0.3 7.30
3   1   2017-01-09 11:52:13 2017-01-09 11:57:36 1   1.10    1   N   236 75  1   6.0 0.0 0.5 1.70    0.00    0.3 8.50
4   2   2017-01-01 00:00:00 2017-01-01 00:00:00 1   0.02    2   N   249 234 2   52.0    0.0 0.5 0.00    0.00    0.3 52.80

2 个答案:

答案 0 :(得分:4)

首先考虑的是,您可以使用read_csv中的kubectl top pod id-for-the-pod参数,该参数接受类似列表的参数来丢弃感兴趣的行(并因此选择)。因此,您可以创建一个长度等于要读取的行数的np.arange,并使用np.delete从其中删除每个skiprows元素:

500th

但是,关于第二个问题,我认为您必须首先加载数据才能检查日期是否已排序,如果日期未排序,则将其排序。

答案 1 :(得分:2)

  

是否可以立即读取第500个元素(使用.pd.read_csv()或其他方法),而不必先读取然后过滤数据?

首先通过自定义函数获取文件的长度,通过numpy.setdiff1d删除每500行,并传递到read_csv中的skiprows参数:

#https://stackoverflow.com/q/845058
def file_len(fname):
    with open(fname) as f:
        for i, l in enumerate(f):
            pass
    return i + 1

len_of_file = file_len('test.csv')
print (len_of_file)

skipped = np.setdiff1d(np.arange(len_of_file), np.arange(0,len_of_file,500))
print (skipped)

df = pd.read_csv('test.csv', skiprows=skipped)
  

如果未订购日期列,您将如何解决此问题?目前,我假设它是按日期排序的,但是所有数据都容易出错。

按参数datetime的{​​{1}}列是只读的,然后排序并选择每个500索引值,求和并再次传递给参数usecols

skiprows