Выберите каждую n-ю строку в качестве кадра данных Pandas, не читая весь файл - PullRequest
0 голосов
/ 17 декабря 2018

Я читаю большой файл, который содержит ~ 9,5 миллионов строк x 16 столбцов.

Я заинтересован в получении репрезентативной выборки, и, поскольку данные организованы по времени, я хочу сделать это, выбравкаждый 500-й элемент.

Я могу загрузить данные, а затем выбрать каждую 500-ю строку.

Мой вопрос: можно ли сразу прочитать каждый 500-й элемент (используя .pd.read_csv () иликаким-то другим способом), без необходимости сначала читать, а затем фильтровать мои данные?

Вопрос 2: Как бы вы подошли к этой проблеме, если бы столбец даты не был упорядочен?В настоящий момент я предполагаю, что он упорядочен по дате, но все данные подвержены ошибкам.

Вот фрагмент того, как выглядят данные (первые пять строк) Первые 4 строки не в порядке,но оставшийся набор данных выглядит упорядоченным (по времени):

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 голосов
/ 17 декабря 2018

Могу ли я сразу прочитать каждый 500-й элемент (используя .pd.read_csv () или каким-либо другим методом), не считывая сначала, а затем отфильтровав мои данные?

Сначала получите длинуфайла с помощью пользовательской функции, удалите каждую строку 500 с помощью 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'])
0 голосов
/ 17 декабря 2018

Для первого рассмотрения вы могли бы использовать параметр skiprows в read_csv, который принимает аргумент в виде списка для отбрасывания интересующих строк (и, следовательно, также выбора),Таким образом, вы можете создать np.arange с длиной, равной количеству строк для чтения, и удалить из нее каждый 500th элемент, используя np.delete:

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)

Однако, что касается второго вопроса, я полагаю, что вам придется сначала загрузить данные, чтобы проверить, отсортирована ли дата или нет, и отсортировать ее, если это не так.

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