如何读取非常大的CSV的一小部分行。熊猫-时间序列-大数据集

时间:2019-05-23 12:41:45

标签: python pandas time-series bigdata

我在一个大文本文件中有一个时间序列。 该文件超过4 GB。

因为它是一个时间序列,所以我只想读取1%的行。

所需的极简示例:

df = pandas.read_csv('super_size_file.log',
                      load_line_percentage = 1)
print(df)

所需的输出:

>line_number, value
 0,           654564
 100,         54654654
 200,         54
 300,         46546
 ...

加载后我无法重新采样,因为首先要加载太多内存。

我可能想逐块加载并重新采样每个块。但是对我来说似乎效率低下。

任何想法都欢迎。 ;)

4 个答案:

答案 0 :(得分:2)

您可以输入使用 read_csv pandas函数时要读取的行数。这是您可以做的:

template <size_t ROWS, size_t COLUMNS>
class MyMatrix
{
    int _matrix[ROWS][COLUMNS];
};

如果您要像上面提到的那样逐块读取数据,也可以使用chunksize选项:

import pandas as pd
# Select file 
infile = 'path/file'
number_of_lines = x
# Use nrows to choose number of rows
data = pd.read_csv(infile,, nrows = number_of_lines*0.01)

答案 1 :(得分:2)

看看Iterating through files chunk by chunk。 它包含一个优雅的描述,说明如何分块读取CSV文件。

基本思想是传递 chunksize 参数(每块行数)。 然后,在一个循环中,您可以逐块读取此文件。

答案 2 :(得分:2)

每当我不得不处理一个非常大的文件时,我都会问“ Dask会做什么?”。

将大型文件作为dask.DataFrame加载,将索引转换为列(由于无法使用完全索引控制而导致的变通方法),然后对该新列进行过滤。

import dask.dataframe as dd
import pandas as pd

nth_row = 100  # grab every nth row from the larger DataFrame
dask_df = dd.read_csv('super_size_file.log')  # assuming this file can be read by pd.read_csv
dask_df['df_index'] = dask_df.index
dask_df_smaller = dask_df[dask_df['df_index'] % nth_row == 0]

df_smaller = dask_df_smaller.compute()  # to execute the operations and return a pandas DataFrame

这将为您提供较大文件中的0、100、200等行。如果要将DataFrame缩减为特定列,请在调用compute,即dask_df_smaller = dask_df_smaller[['Signal_1', 'Signal_2']]之前执行此操作。您也可以使用scheduler='processes'选项调用compute以使用CPU上的所有内核。

答案 3 :(得分:0)

这应该做您想要的。

# Select All From CSV File Where

import csv
# Asks for search criteria from user
search_parts = input("Enter search criteria:\n").split(",")
# Opens csv data file
file = csv.reader(open("C:\\your_path\\test.csv"))
# Go over each row and print it if it contains user input.
for row in file:
    if all([x in row for x in search_parts]):
        print(row)

# If you only want to read rows 1,000,000 ... 1,999,999
read_csv(..., skiprows=1000000, nrows=999999)