Как читать несколько файлов с помощью read_csv или lambda - PullRequest
0 голосов
/ 31 января 2019

Я читаю один и тот же текстовый файл дважды через read_csv.Впервые получить список ключей, которые соответствуют определенной строке (MSG) с «Col6» в этом файле.Это даст мне фрейм данных только с теми записями, которые соответствуют 'Col6'.Затем второй раз я читаю тот же файл (снова с read_csv) и печатаю еще несколько столбцов, если key1 == key2, которые основаны на 'Col1'.

У меня есть два основных вопроса: 1. Могу ли я объединитьоба поиска (read_csv) вместе?2. Даже если я храню два read_csv отдельно, как я могу прочитать несколько файлов?Сейчас я читаю только один файл (firstFile.txt), но я хотел бы заменить имя файла на '*.txt', чтобы операции read_csv выполнялись для всех файлов *.txt в каталоге.

Файл данных выглядит следующим образом.Я хочу напечатать все строки с Col1=12345, поскольку Col6 имеет значение 'This is a test'.

Col1  Col2    Col3    Col4    Col5    Col6
-       -       -       -       -       -
54321 544     657     888     4476    -
12345 345     456     789     1011    'This is a test'
54321 644     857     788     736     -
54321 744     687     898     7436    -
12345 365     856     789     1020    -
12345 385     956     689     1043    -
12345 385     556     889     1055    -
65432 444     676     876     4554    -
-     -       -       -       -       -
54321 544     657     888     776     -
12345 345     456     789     1011    -
54321 587     677     856     7076    -
12345 345     456     789     1011    -
65432 444     676     876     455     -
12345 345     456     789     1011    -
65432 447     776     576     4055    -
-     -       -       -       -       -   
65432 434     376     576     4155    -

Сценарий, который я использовал:

import csv
import pandas as pd
import os
import glob

DL_fields1 = ['Col1', 'Col2']
DL_fields2 = ['Col1', 'Col2','Col3', 'Col4', 'Col5', 'Col6']

MSG = 'This is a test'

iter_csv = pd.read_csv('firstFile.txt', chunksize=1000, usecols=DL_fields1, skiprows=1)
df = pd.concat([chunk[chunk['Special_message'] == MSG] for chunk in iter_csv])

for i, row in df.iterrows():
    key1 = df.loc[i, 'Col1']
    j=0
    for line in pd.read_csv('firstFile.txt', chunksize=1, usecols=DL_fields2, skiprows=1, na_values={'a':'Int64'}):
        key2 = line.loc[j,'Col1']
        j = j + 1
        if (key2 == '-'):
            continue
        elif (int(key1) == int(key2)):
            print (line)

1 Ответ

0 голосов
/ 31 января 2019

Насколько я понимаю, вам не нужно читать CSV-файл дважды.По сути, вам нужны все строки, где MSG встречается в Col6.Вы можете достичь этого в одной строке -

MSG = 'This is a test'
iter_csv = pd.read_csv('firstFile.txt', chunksize=1000, usecols=DL_fields1, skiprows=1)
# this gives you all the rows where MSG occurs in Col6
df = iter_csv.loc[iter_csv['Col6'] == MSG, :]
# this gives you all the rows where 12345 in Col1
df_12345 = df.loc[iter_csv['Col1'] == 12345,]

Таким способом вы можете создать несколько подмножеств данных.


Чтобы ответить на вторую часть вашего вопроса, вы можете выполнить циклдля всех текстовых файлов, например, так -

import glob
txt_files = glob.glob("test/*.txt")
for file in txt_files:
    with open(file, 'r') as foo:
        some_df = pd.read_csv(file)

РЕДАКТИРОВАТЬ: Вот как вы перебираете файлы и находите все ключи с помощью Col1=12345 и Col6=MSG -

import glob
from functools import reduce

results_list = []
MSG = 'This is a test'

txt_files = glob.glob("test/*.txt")
for file in txt_files:
    with open(file, 'r') as foo:
        some_df = pd.read_csv(file, chunksize=1000, usecols=DL_fields1, skiprows=1)
        df = iter_csv.loc[iter_csv['Col6'] == MSG, :]
        # results_list is a list of all such dataframes
        results_list.append(df.loc[iter_csv['Col1'] == 12345, ])

# All results in one big dataframe
result_df = reduce(lambda x,y: pd.concat([x,y]), results_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...