Pandas - Как создать однорядный фрейм данных, используя несколько столбцов другого фрейма - PullRequest
0 голосов
/ 18 марта 2020

Я искал, как «создать однострочный фрейм данных, используя несколько столбцов другого фрейма данных» по всему переполнению стека и на других сайтах, но я получаю только такие предметы, как «как объединить столбцы» или «как объединить фреймы данных». Но я не видел, как объединить имена столбцов.

У меня есть 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

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