Я хотел бы добавить новый столбец в pandas dataframe df
, заполненный данными, находящимися во многих других файлах.
Скажите, что мой df
выглядит следующим образом:
Sample Pos
A 5602
A 3069483
B 51948
C 231
И у меня есть три файла A_depth-file.txt
, B_depth-file.txt
, C_depth-file.txt
, как это (показывает A_depth-file.txt
):
Pos Depth
1 31
2 33
3 31
... ...
5602 52
... ...
3069483 40
В желаемом выводе df
будет новый столбец Depth
следующим образом:
Sample Pos Depth
A 5602 52
A 3069483 40
B 51948 32
C 231 47
У меня есть метод, который работает, но заполнение df
712 строками занимает около 20 минут, поиск в файлах ~ 4 миллиона строк (= позиции).Кто-нибудь знает лучше / быстрее , чтобы сделать это?
Код, который я использую сейчас:
import pandas as pd
from io import StringIO
with open("mydf.txt") as f:
next(f)
List=[]
for line in f:
df = pd.read_fwf(StringIO(line), header=None)
df.rename(columns = {df.columns[1]: "Pos"}, inplace=True)
f2basename = df.iloc[:, 0].values[0]
f2 = f2basename + "_depth-file.txt"
df2 = pd.read_csv(f2, sep='\t')
df = pd.merge(df, df2, on="Pos", how="left")
List.append(df)
df = pd.concat(List, sort=False)
with open("mydf.txt") as f:
, чтобы открыть файл, к которомуЯ хочу добавить данные
next(f)
для передачи заголовка
List=[]
, чтобы создать новый пустой массив с именем List
for line in f:
, чтобы перейти mydf.txt
построчно и читая их с помощью df = pd.read_fwf(StringIO(line), header=None)
df.rename(columns = {df.columns[1]: "Pos"}, inplace=True)
, чтобы переименовать потерянное имя заголовка для столбца Pos
, используется позже при объединении строки с соответствующим файлом f2
f2basename = df.iloc[:, 0].values[0]
получение базового имени связанного файла f2
на основе 1-го столбца mydf.txt
f2 = f2basename + "_depth-file.txt"
для получения полного ассоциированного файла f2
name
df2 = pd.read_csv(f2, sep='\t')
для чтения файла f2
df = pd.merge(df, df2, on="Pos", how="left")
, чтобы объединить два файла в столбце Pos
, добавив столбец Depth
к mydf.txt
List.append(df)
, добавив измененную строку в массив List
df = pd.concat(List, sort=False)
для объединения элементов массива List
в кадр данных df
Дополнительные примечания
На самом деле, явозможно, придется искатьch не только три файла, но и несколько сотен.