选择每第n行作为Pandas DataFrame,而无需读取整个文件[英] Select every nth row as a Pandas DataFrame without reading the entire file

本文是小编为大家收集整理的关于选择每第n行作为Pandas DataFrame,而无需读取整个文件的处理方法,想解了选择每第n行作为Pandas DataFrame,而无需读取整个文件的问题怎么解决?选择每第n行作为Pandas DataFrame,而无需读取整个文件问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在阅读一个大文件,其中包含约950万行x 16上校.

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

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

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

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

这是数据的外观(前五行),前4行是故障的,bu剩余的数据集看起来(按时间):

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

推荐答案

我可以立即读取每500个元素(使用.pd.read_csv()或其他方法),而无需先读取,然后过滤我的数据?

您可以做的事情是在 read_csv 接受类似列表的参数来丢弃感兴趣的行(因此也选择).因此,您可以创建一个 np.arange np.arange np.arange 长度等于要读取的行的长度,并使用 np.delete ,因此,这样,我们只会阅读每500排:

n_rows = 9.5e6
skip = np.arange(n_rows)
skip = np.delete(skip, np.arange(0, n_rows, 500))
df = pd.read_csv('my_file.csv', skiprows = skip)

其他推荐答案

我可以立即阅读每500个元素(使用.pd.read_csv()或其他方法),而无需先读取,然后过滤我的数据?

首先通过自定义函数获取文件的长度, numpy.setdiff1d ,然后传递到skiprows参数 read_csv :

#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列的参数usecols,然后对每个500索引值进行排序,获取差异并再次传递给参数skiprows:

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')

df1 = pd.read_csv('test.csv',
                  usecols=['tpep_pickup_datetime'],
                  parse_dates=['tpep_pickup_datetime'])

sorted_idx = (df1['tpep_pickup_datetime'].sort_values()
                 .iloc[np.arange(0,len_of_file,500)].index)

skipped = np.setdiff1d(np.arange(len_of_file), sorted_idx)
print (skipped)

df = pd.read_csv('test.csv', skiprows=skipped).sort_values(by=['tpep_pickup_datetime'])

其他推荐答案

您可以使用csv模块返回迭代器并使用itertools.cycle选择每个第n行.

import csv
from itertools import cycle

source_file='D:/a.txt'
cycle_size=500
chooser = (x == 0 for x in cycle(range(cycle_size))) 
with open(source_file) as f1:
    rdr = csv.reader(f1) 
    data = [row for pick, row in zip(chooser, rdr) if pick]

本文地址:https://www.itbaoku.cn/post/1728065.html