Я искал, как «создать однострочный фрейм данных, используя несколько столбцов другого фрейма данных» по всему переполнению стека и на других сайтах, но я получаю только такие предметы, как «как объединить столбцы» или «как объединить фреймы данных». Но я не видел, как объединить имена столбцов.
У меня есть tsv
файлы, которые я импортирую в python, используя Pandas
. Фреймы данных выглядят так:
min_mz_parent | max_mz_parent | mz_bin | intensity
405 | 415 | 999 | 750
405 | 515 | 1000 | 5482
405 | 515 | 1001 | 6487
...
705 | 715 | 999 | 847
705 | 715 | 1000 | 12546
У меня 160 файлов с таким типом записи. Я хотел бы перебрать все из них, а затем объединить значение column 1, 2 and 3
, чтобы создать имя нового столбца в новом фрейме данных, и значение, соответствующее этому новому столбцу, будет the value of the 4th column
в первом фрейме данных. В конце я бы хотел, чтобы конечный кадр данных был таким (если есть один файл и больше строк, если используется больше файлов):
405_415_999 | 405_415_1000 | 405_415_1001 | ... | 705_715_999 | 705_715_1000_12546
750 | 5482 | 6487 | ... | 847 | 12546
У меня уже есть функциональный код. Он работает с небольшими файлами (500ko), но требует много времени, когда я хочу применить его к огромным файлам: изменить и объединить 160 файлов TSV по 120Mo каждый.
Я слышал, что с помощью iterrows()
, Я мог бы потерять много времени, и я должен использовать vectorization
, но я все еще не понимаю, как это сделать с моей проблемой.
Вот код, который у меня есть сейчас (я не импортировал первый, если Скажите, что проверьте args
, потому что это не связано с моей проблемой с фреймом данных:
tsv_list = glob.glob(args.dir + '*.tsv')
concat_tsv = pd.DataFrame()
count_file = 1
elif args.MS == 'MS2':
for file in tsv_list:
name = {'sample': file.split('/')[-1]}
if 'high_J' in name['sample']:
continue
# Define target class name
if name['sample'].split('_')[0:1][0] in ['UP', 'SS', 'SM', 'SH','SE','SA','PM','PA','KP','KO','EF','EA','CF']:
target_class = [name['sample'].split('_')[0:1][0]]
elif name['sample'].split('_')[0:1][0] in ['SAu', 'ECl']:
target_class = name['sample'].split('_')[0:1][0]
elif 'Blanc' in name['sample']:
target_class = ['Blank']
else :
target_class = ['']
print('Wrong name : '+name['sample'])
print('Currently converting and adding : ' + name['sample'] + ' ### File n°' + str(count_file))
tsv = pd.read_csv(file, sep='\t')
# Create temporary pandas dataframe for each file
tmp = pd.DataFrame(name, index=[0])
tmp['target'] = target_class
# Iterate on each dataframe file and extract information
for index, row in tsv.iterrows():
mz = str(row['min_mz_parent']) + "_" + str(row['max_mz_parent']) + '_' + str(row['mz_bin'])
row_df = [row['intensity']]
tmp[mz] = row_df
concat_tsv = pd.concat([concat_tsv, tmp], axis=0, ignore_index=True)
count_file += 1
Если вы хотите получить больше информации, чтобы помочь мне, пожалуйста, дайте мне знать. Я sh вам хорошего дня.
Эльза C