#python #pandas #numpy
#python #pandas #numpy
Вопрос:
У меня есть фрейм данных df1 с большим количеством строк:
AA ID info
H5R SSF43 up
V53P FG46Z up
X1M HJ44-2 down
P324N 2HUVG up
L2F SSF43 down
G223J FG46Z up
и список, содержащий много имен файлов:
['SSF43_354635.csv', 'HJ44-2_GF6453.csv', 'FG46Z_45362.csv', '2HUVG_223IU.csv',
'SSF43_00202E.csv', 'FG46Z_01873GF.csv']
Я ищу более быстрый способ просмотра столбца ID, и если идентификатор встречается в любом имени файла, прочитайте файлы и найдите значение в столбце AA.
Я пробовал это до сих пор:
import pandas as pd
from os.path import isfile, join
from os import listdir
import numpy as np
df1 = pd.read_csv('data_info.csv', sep = 't')
file_names = [i for i in listdir('/content/data_files') if isfile(join('/content/data_files', i))]
df1["In_List"] = np.where(df1["ID"].isin([i.split('_', 1)[0] for i in file_names]), "True", "False")
# This part is slowing me down as it takes too long to run
for i in df1.iloc[:,1]:
if i in [i.split('_', 1)[0] for i in file_names]:
# DO Something
Комментарии:
1. создайте список имен файлов, где key — это часть перед _, а value — список всех имен файлов с этим началом,
2. Спасибо, хорошая идея, это очень помогло. Есть ли у вас какие-либо предложения по сопоставлению каждого значения в столбце AA с соответствующим идентификатором? т.е. сопоставление {‘HJ44-2’: [‘HJ44-2_GF6453.csv’] … } в X1M.
Ответ №1:
Кажется, все еще не удается решить эту проблему.
tmp = df1.loc[df1['ID'].isin(file_name_dict.keys())]
for index, row in tmp.iterrows():
for fn in file_name_dict[row['ID']]:
with open(fn, 'r') as f:
if row['AA'] in f:
print(row)
Ответ №2:
не уверен, в чем проблема
import pandas as pd
from collections import defaultdict as dd
f_names = ['SSF43_354635.csv', 'HJ44-2_GF6453.csv', 'FG46Z_45362.csv', '2HUVG_223IU.csv', 'SSF43_00202E.csv', 'FG46Z_01873GF.csv']
file_name_dict = dd(list)
for current_file_name in file_name:
splited = current_file_name.split('_')
file_name_dict[splited[0]].append(splited[1])
id_dict = dd(list)
#to avoid multiple use of df.loc, iterate one time and create a dict
for index,row in df.iterrows():
id_dict[row['ID']].append(row['AA'])
for ID in file_name_dict:
if ID not in id_dict:
continue
AA_set = set(id_dict['ID'])
for currnet_fname in file_name_dict['ID']:
tmp_df = pd.read_csv(currnet_fname)
for index,row in tmp_df.iterrows():
if row['column_name_you_need'] in AA_set:
#do what you need
может быть, более официальный поиск бросил файл для всех значений, которые вы хотите открыть в одном файле
Комментарии:
1. Спасибо, я попробовал код (который я привел ниже), но все еще испытываю проблемы. Есть предложения?