Я работаю с двумя кадрами данных pandas, «alignmentdf» и genbankdf.
aligndf содержит «выравнивание последовательности ДНК» в виде кадра данных с индексом в виде «идентификаторов таксономии», это просто целые числа и столбцы, представляющие номера кодонов (как целые числа)
genbankdf содержит данные об «использовании кодонов» для всех известных таксономий, поэтому снова с индексом, снова являющимся идентификаторами таксономии, и столбцами, представляющими частоты кодонов на 1000 кодонов.
Я хочу создать новый фрейм данных df3, который идет столбец за столбцом вaligndf, перебирает строки, находит соответствующий индекс (т.е. таксономический идентификатор) в genbankdf, выполняет расчет, используя значения в genbankdf, в зависимости от того, какой «кодон» у меня есть вaligndf, и вывести его в df3, который во всех отношениях идентичен выравниваниюdf, но кодоны заменяются вычисленными значениями.
Я новичок в модуле pandas, и я сделал несколько руководств, используя поиск на YouTube и Google, и я подозреваю, что мне, возможно, придется использовать функцию «.apply», но я в тупике относительно синтаксиса, который мне нужен, чтобы делать то, что я хочу.
alignmentdf.head(5)
Out[38]:
0 1 2 3 \
1076443 gi|1361169408|ref|WP_106366082.1| NAD(P)-depen... ATG AAA GCC
1076450 gi|1184222407|gb|OSC61482.1| alcohol dehydroge... ATG AAA GCC
110934 gi|947160360|ref|WP_055933433.1| MULTISPECIES:... ATG AAG GCG
1156841 gi|517339444|ref|WP_018514936.1| NAD(P)-depend... ATG AAA GCC
1156844 gi|517353486|ref|WP_018528978.1| NAD(P)-depend... ATG AAG GCA
4 5 6 7 8 9 ... 345 346 347 348 349 350 351 \
1076443 CTG CAA TAC CGC GAG ATC ... GGG CGC GCG GTG ATC CTG CCG
1076450 GTT CAG TAC CGA GCC GTC ... GGC AGG GCC GTC ATC CTC CCC
110934 CTC CAG TAC ACG ACC ATC ... GGT CGC GCG GTG ATC CTG CCC
1156841 GTC CAG TAC CGG GCC GTC ... GGC CGC GCG GTG ATC CTG CCG
1156844 CTG CAG TAC CGG AGC GTC ... GGC CGC GCG GTG ATC CTG CCC
352 353 354
1076443 --- --- TGA
1076450 --- --- TGA
110934 --- --- TGA
1156841 --- --- TGA
1156844 --- --- TGA
[5 rows x 355 columns]
genbankdf.head(5)
Out[40]:
Division Assembly Species Organelle \
Taxid
939668 genbank NaN gamma proteobacterium SCGC AAA240-C10 genomic
1938820 genbank NaN Serratia sp. JKS000199 genomic
768468 genbank NaN Dulcina sp. TB-2010 gill endosymbiont genomic
1549058 genbank NaN Bradyrhizobium sp. dxwr4 genomic
477226 genbank NaN Pseudomonas sp. SY6 genomic
Translation Table # CDS # Codons GC% GC1% GC2% ... CGA \
Taxid ...
939668 11 1 122 59.02 58.20 46.72 ... 1
1938820 11 4700 1498667 61.12 63.10 42.49 ... 2886
768468 11 1 165 51.72 61.21 40.61 ... 0
1549058 11 5 993 60.99 61.23 40.89 ... 1
477226 11 1 230 66.38 65.65 47.39 ... 1
CGG AGT AGC AGA AGG GGT GGC GGA GGG
Taxid
939668 3 0 3 0 0 6 1 1 2
1938820 14562 4320 35109 1770 1655 14372 79485 4405 17593
768468 0 0 0 0 0 16 3 0 0
1549058 10 2 11 1 3 21 53 8 6
477226 3 0 6 0 1 1 8 0 4
[5 rows x 75 columns]
Я ожидаю фрейм данных (df3), который идентичен выравниванию df, но кодон заменен расчетом «смещения использования кодона», основанным на значениях в строке genbankdf с тем же индексом, что и выравнивание.

Используйте DataFrame.lookup в цикле, потому что работаете с несколькими столбцами:
print (alignmentdf)
0 1 2 3
1076443 gi|1361169408|ref|WP_106366082.1| NAD(P)-depen ATG AAA GCC
1076450 gi|1184222407|gb|OSC61482.1| alcohol dehydroge ATG AAA GCC
110934 gi|947160360|ref|WP_055933433.1| MULTISPECIES: ATG AAG GCG
1156841 gi|517339444|ref|WP_018514936.1| NAD(P)-depend ATG AAA GCC
1156800 gi|517353486|ref|WP_018528978.1| NAD(P)-depend ATG AAG GCA
print (genbankdf)
ATG AAA GCC AAG GCG GGT GGC GCA # Codons
110934 0 0 0 0 0 16 3 0 100
1076443 3 0 3 0 0 6 1 2 100
1156841 10 2 11 1 3 --- 8 6 100
1076450 14562 4320 35109 1770 1655 14372 79485 17593 ---
1156844 30 1 4 5 6 3 2 1 100
1156844 3 0 6 0 1 1 8 0 10
#remove duplicates in index, add missing values to genbankdf for correct mach
genbankdf = genbankdf[~genbankdf.index.duplicated()]
genbankdf = genbankdf.reindex(genbankdf.index.union(alignmentdf.index))
genbankdf['---'] = np.nan
print (genbankdf)
ATG AAA GCC AAG GCG GGT GGC GCA \
110934 0.0 0.0 0.0 0.0 0.0 16 3.0 0.0
1076443 3.0 0.0 3.0 0.0 0.0 6 1.0 2.0
1076450 14562.0 4320.0 35109.0 1770.0 1655.0 14372 79485.0 17593.0
1156800 NaN NaN NaN NaN NaN NaN NaN NaN
1156841 10.0 2.0 11.0 1.0 3.0 --- 8.0 6.0
1156844 30.0 1.0 4.0 5.0 6.0 3 2.0 1.0
# Codons
110934 100
1076443 100
1076450 ---
1156800 NaN
1156841 100
1156844 100
s = pd.to_numeric(genbankdf['# Codons'], errors='coerce') * 1000
df3 = alignmentdf.copy()
for c in alignmentdf.columns[1:]:
df3[c] = genbankdf.lookup(alignmentdf.index, alignmentdf[c])
df3[c] = pd.to_numeric(df3[c], errors='coerce').div(s)
print (df3)
0 1 2 \
1076443 gi|1361169408|ref|WP_106366082.1| NAD(P)-depen 0.00003 0.00000
1076450 gi|1184222407|gb|OSC61482.1| alcohol dehydroge NaN NaN
110934 gi|947160360|ref|WP_055933433.1| MULTISPECIES: 0.00000 0.00000
1156841 gi|517339444|ref|WP_018514936.1| NAD(P)-depend 0.00010 0.00002
1156800 gi|517353486|ref|WP_018528978.1| NAD(P)-depend NaN NaN
3
1076443 0.00003
1076450 NaN
110934 0.00000
1156841 0.00011
1156800 NaN
@user1998510 user1998510 - сначала вы его запускаете? Ошибка была или нет?
Я запустил его и получил ошибки для обоих; и поскольку я недостаточно продвинут, чтобы точно понять, что происходит с кодом, ошибки также не имеют для меня особого смысла. ValueError: метки строк должны иметь тот же размер, что и метки столбцов для кода Dataframe.lookup KeyError: ('---', u'произошло по индексу 1') для кода Dataframe.apply
для кода Dataframe.lookup я получаю ValueError: метки строк должны иметь тот же размер, что и метки столбцов
Я также понял, что мой вопрос, возможно, недостаточно ясен - для каждого значения вaligndf (например, ATG индексного ключа: 1076443) я хотел найти значение пересечения 1076443 и ATG в genbankdf, а не просто вывести значение, но выполните расчет с этим значением (используя значения в той же строке, а именно (значение ATG / #codons) * 1000, и поместите его в качестве нового значения в df3 в этой позиции, поэтому я подумал, что мне нужно использовать функцию применения , но, возможно, это все еще не нужно.
@user1998510 user1998510 - проблема на моей стороне, расследуй. есть только формула (ATG value / #codons)*1000 ? Или сложнее?
Давайте продолжить обсуждение в чате.
Спасибо за ваш ответ, jezrael, могу ли я попросить объяснить, как работают ваши два решения кода и каков будет вывод df3?