объединить в python по определенным столбцам из списка файлов - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть каталог с> 200 файлами с разделителями табуляции и той же структурой (столбцы #, заголовки столбцов)

+------+--------------+-------+-------+-----------+------+---------+
| col1 |     col2     | col2  | col3  | p_val_adj | col4 |  gene   |
+------+--------------+-------+-------+-----------+------+---------+
|    0 |  1.980029448 | 0.978 | 0.124 |         0 |    0 | TRDV2   |
|    0 |  1.812616859 | 0.979 | 0.176 |         0 |    0 | TRGV9   |
|    0 |  1.442023797 | 0.688 |  0.09 |         0 |    0 | TRDC    |
|    0 | -1.834847304 | 0.021 | 0.735 |         0 |    0 | TRAV1-2 |
+------+--------------+-------+-------+-----------+------+---------+

Моя цель - создать выходной файл, который содержит «ген» первым столбец и объединить все данные столбца "avg_logF C" из всех файлов. Для непересекающихся генов оставьте значение пустым.

Шаги, которые необходимо сделать: 1) прочитать все файлы в каталоге, заканчивающиеся на .txt [done] ex: File1.txt, File2.txt, File3.txt 2) использовать столбец "gene" в качестве index_col [done] 3) объединить файлы в один фрейм данных [ошибка] 4) заголовок столбца вместо avg_logF C должен отражать имя файла

Вот что я сделал до сих пор:

args = parse_args()
    path=os.getcwd() #opens the path
    allFiles = glob.glob(path + "/*.txt")    #reads all files in the path with .txt
    result = pd.read_csv(allFiles[0], sep="\t", index_col=["gene"]) #index by gene
    for i in range(1,len(allFiles)): #iterates over remaining files; note first file is 0.
        print i
        df = pd.read_csv(allFiles[i], sep="\t", index_col=["gene"])
        result = pd.merge(result, df, right_index=False, left_index=True, how='inner')
result.to_csv(args.output+".xls", sep="\t", na_rep="")

Я не могу получить желаемый результат, который проиллюстрирован ниже.

+----------+-------+-------+--------+
|  genes   | File1 | File2 | File 3 |
+----------+-------+-------+--------+
| TRDV2    |   0.5 |    12 |      2 |
| TRGV9    |     2 |     2 |        |
| TRDC     |    -2 |     3 |      1 |
| TRAV1-2  |       |    21 |     -5 |
| CD8A     |  0.24 |       |     -2 |
| TRBV20-1 |     3 |     1 |     -2 |
| TRBC1    |   0.2 |       |      3 |
| FCGR3A   |     1 |     2 |      4 |
+----------+-------+-------+--------+

1 Ответ

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

Во-первых, how должно быть outer, а не inner, в противном случае вы получите только гены, которые есть во всех данных, также я не уверен, почему right_index имеет значение False, если вы хотите слиться по генам, что является индексом. Второе, что неясно, это где находится столбец avg_logF C, потому что его нет в вашем примере, я предполагаю, что это столбец, и если это так, вы не должны merge полный df, а выбирать только этот столбец до merge. Наконец, использование merge на каждой итерации не очень эффективно (не уверен, что это проблема). Я думаю, что было бы лучше использовать concat здесь как:

args = parse_args()
path=os.getcwd() #opens the path
allFiles = glob.glob(path + "/*.txt")    #reads all files in the path with .txt

result = pd.concat([pd.read_csv(file, sep="\t", index_col=["gene"], usecols=['avg_logFC'])
                    for file in allFiles], 
                   axis=1, keys=range(len(allFiles)))\
           .reset_index()

result.to_csv(args.output+".xls", sep="\t", na_rep="")

Не уверен в точном выводе, но он должен быть довольно близок к тому, что вы ищете. Может быть, вам нужно rename столбец до reset_index

...