Отправка нескольких строк для работы с pandas - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть 8492 строка (строка) в CSV-файле. В каждой итерации мне нужно отправлять 1000 строк в functionX, кроме последней итерации, она должна отправлять 1492 строки (1000 и оставшаяся строка меньше 1000 строк), я спрашиваю, как я могу обновить свой код, чтобы сделать это?

import pandas as pd

    Path_source_file = 'C:/Users/lap/Desktop/bone/Z1.csv' 
    row_count = len(open(Path_source_file).readlines())
    print(row_count)
    count = 1000    # number of sending dataset
    skip=0
    nraw = 1000
    no_cluster = 0
    for i in range(1,row_count+1):
        if count <= row_count  :

            dataset = pd.read_csv(Path_source_file, skiprows=skip ,nrows=nraw,header=None) 
            X = dataset.iloc[:,[0,0]].values
            functionX(X,i)
            no_cluster +=1
            count += 1000
            skip += 1000 
        if(no_cluster == 9):   

          break 

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Чтобы не читать все файлы одновременно, вам все равно нужно прочитать 2 1000 фрагментов (что, я полагаю, вы можете сделать, поскольку в худшем случае вы можете прочитать 1000 + 999):

import pandas as pd

Path_source_file = 'C:/Users/lap/Desktop/bone/Z1.csv' 
count = 1000    # number of sending dataset
chunk0 = pd.read_csv(Path_source_file, chunksize=count, header=None)
readLast = False
for chunk1 in pd.read_csv(Path_source_file, chunksize=count, header=None):
    if chunk1.shape[0] == 1000: # All but last iteration (except special case)
        data = chunk0
        chunk0 = chunk1
    else: # Last iteration
        data = chunk0.append(chunk1)
        readLast = True
    X = data.iloc[:,[0,0]].values
    functionX(X) # I removed the index i, I let you reimplement it if needed
if not readLast: # Special case with multiple of 1000, do the last chunk here.
    X = chunk0.iloc[:,[0,0]].values
    functionX(X) # I removed the index i, I let you reimplement it if needed

0 голосов
/ 18 апреля 2020

Если это не массивный файл (8 492 кажется разумным), тогда вы можете прочитать весь лот, а затем создать ключ группировки и уменьшить последний ключ, если он встречается менее чем в N раз, например:

import numpy as np
import pandas as pd

N = 1000
df = pd.read_csv('C:/Users/lap/Desktop/bone/Z1.csv')
g = df.index // N
g = np.where((g == g[-1]) & ((g == g[g-1]).sum() < N), g[-1] -1, g)
for _, dataset in df.groupby(g):
    # ... do your things with dataset and functionX here...

С pd.Series(list('abcde')), тогда N == 2 дает вам группы [a, b] и [c, d, e], а с N == 3 вы получаете одну группу [a, b, * +1007 *, д, е]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...