Как можно использовать функцию применения в пандах при сопоставлении индекса с двумя разными фреймами данных?

Я работаю с двумя кадрами данных 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 с тем же индексом, что и выравнивание.

1
0
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте 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  

Спасибо за ваш ответ, jezrael, могу ли я попросить объяснить, как работают ваши два решения кода и каков будет вывод df3?

user1998510 10.04.2019 15:48

@user1998510 user1998510 - сначала вы его запускаете? Ошибка была или нет?

jezrael 10.04.2019 15:49

Я запустил его и получил ошибки для обоих; и поскольку я недостаточно продвинут, чтобы точно понять, что происходит с кодом, ошибки также не имеют для меня особого смысла. ValueError: метки строк должны иметь тот же размер, что и метки столбцов для кода Dataframe.lookup KeyError: ('---', u'произошло по индексу 1') для кода Dataframe.apply

user1998510 10.04.2019 15:52

для кода Dataframe.lookup я получаю ValueError: метки строк должны иметь тот же размер, что и метки столбцов

user1998510 10.04.2019 15:54

Я также понял, что мой вопрос, возможно, недостаточно ясен - для каждого значения вaligndf (например, ATG индексного ключа: 1076443) я хотел найти значение пересечения 1076443 и ATG в genbankdf, а не просто вывести значение, но выполните расчет с этим значением (используя значения в той же строке, а именно (значение ATG / #codons) * 1000, и поместите его в качестве нового значения в df3 в этой позиции, поэтому я подумал, что мне нужно использовать функцию применения , но, возможно, это все еще не нужно.

user1998510 10.04.2019 16:00

@user1998510 user1998510 - проблема на моей стороне, расследуй. есть только формула (ATG value / #codons)*1000 ? Или сложнее?

jezrael 10.04.2019 16:02

Давайте продолжить обсуждение в чате.

user1998510 10.04.2019 16:02

Другие вопросы по теме