Удалить все строки в наборе данных> = значение - PullRequest
0 голосов
/ 22 апреля 2020

У меня обширный набор данных, содержащий более 400 000 строк. Вот пример набора данных:

40005 1583274133
40000 1583274134
40004 1583274135
40004 1583274136
160 1583274137
40005 1583274137
40006 1583274138
40003 1583274139
40001 1583274140
40003 1583274141
40003 1583274142

Мне нужно удалить любые линии, которые начинаются с числа, большего или равного 40000. Это физические данные частиц для скоростей распада мюонов, так что любые более 40000 наносекунд в основном бесполезно. Я знаю, как открывать и записывать файлы, я просто не уверен, какой самый эффективный способ избавиться от всех строк с 40000 или больше, как в первом столбце. Файл - это текстовый файл, разделенный вкладками.

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Вот простое решение Python, которое обрабатывает входные данные построчно, поэтому у него нет проблем с масштабированием при использовании памяти:

with open(in_file) as f_in, open(out_file, 'w') as f_out:
    for line in f_in:
        if int(line.split()[0]) < 40000: #checking the condition
            f_out.write(line)
0 голосов
/ 22 апреля 2020

Использование pandas

import pandas as pd

# read in your data
df = pd.read_csv('test.txt', sep='\t')

    time    value
0   40005   1583274133
1   40000   1583274134
2   40004   1583274135
3   40004   1583274136
4   160     1583274137
5   40005   1583274137
6   40006   1583274138
7   40003   1583274139
8   40001   1583274140
9   40003   1583274141
10  40003   1583274142


# filter the data
# assigning the filtered data back to df keeps only the desired data
# if you want to maintain all the data, use a different variable
df = df[df['time'] < 40000]

# save df
df.to_csv('filtered.txt', sep='\t', index=False)

print(df)

    time    value
4   160     1583274137

Использование памяти:

  • Несмотря на комментарии, нормально загружать столько данных в память, в противном случае, как бы мы делали большие данные.
  • Это слишком много если вам не хватает оперативной памяти.
  • Как показано, для dataframe этого размера, memory usage: 6.1 MB.
  • Dask , который имеет аналог API до pandas, может обрабатывать гораздо большие наборы данных.
time = [*range(400000)]
value = [*range(1583234128, 1583634128)]

df = pd.DataFrame({'time': time, 'value': value})

print(df.head())

time    value
0   1583234128
1   1583234129
2   1583234130
3   1583234131
4   1583234132

print(df.tail())

time    value
399995  1583634123
399996  1583634124
399997  1583634125
399998  1583634126
399999  1583634127

print(df.info())

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 400000 entries, 0 to 399999
Data columns (total 2 columns):
 #   Column  Non-Null Count   Dtype
---  ------  --------------   -----
 0   time    400000 non-null  int64
 1   value   400000 non-null  int64
dtypes: int64(2)
memory usage: 6.1 MB
...