如何在 pandas 中使用 apply 函数,同时将索引映射到两个不同的数据帧?

Posted

技术标签:

【中文标题】如何在 pandas 中使用 apply 函数,同时将索引映射到两个不同的数据帧?【英文标题】:How can one use the apply function in pandas, while mapping the index across two different dataframes? 【发布时间】:2019-08-31 22:01:02 【问题描述】:

我正在使用两个 pandas 数据框,“alignmentdf”和 genbankdf。

alignmentdf 包含一个“DNA 序列比对”作为数据框,索引为“分类 ID”,这些只是整数和表示密码子编号的列(作为整数)

genbankdf 包含有关所有已知分类法的“密码子使用”的数据,因此索引再次是分类法 ID,并且列表示每 1000 个密码子的密码子频率。

我想创建一个新的数据框 df3 ,它在 alignmentdf 中逐列遍历,循环遍历行,在 genbankdf 中找到相应的索引(即分类 ID),使用 genbankdf 中的值执行计算,具体取决于“密码子” " 我在 alignmentdf 中,并将其输出到 df3 ,这在各个方面都与 alignmentdf 相同,但密码子被替换为计算值。

我是 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 行中的值通知,索引与 alignmentdf 相同。

【问题讨论】:

【参考方案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 - 你首先运行它吗?有没有错误? 我确实运行了它,但两者都有错误;而且因为我不够先进,无法准确理解代码发生了什么,所以这些错误对我来说也没有太大意义。 ValueError: 行标签的大小必须与 Dataframe.lookup 代码的列标签大小相同 KeyError: ('---', u'occurred at index 1') for Dataframe.apply code 对于 Dataframe.lookup 代码我得到 ValueError: Row labels must have the same size as column labels 我也意识到我的问题可能不够清楚 - 对于alignmentdf中的每个值(例如索引键的ATG:1076443),我希望它在genbankdf中找到1076443和ATG的交集值,而不仅仅是输出该值,而是使用该值执行计算(使用同一行中的值,即 (ATG value / #codons)*1000 并将其作为新值放入 df3 中的该位置,这就是为什么我以为我必须使用 apply 功能,但也许仍然没有必要。

以上是关于如何在 pandas 中使用 apply 函数,同时将索引映射到两个不同的数据帧?的主要内容,如果未能解决你的问题,请参考以下文章

如何比较多列,并在单个新列中生成值,在 Pandas 中使用 Apply 函数

如何在 pandas 中使用 apply 函数,同时将索引映射到两个不同的数据帧?

Python Pandas:如何在不编写辅助函数的情况下使用 apply 广播操作

如何使用天数作为 pandas rolling_apply 函数的窗口

pandas使用apply函数:在dataframe数据列(column)上施加(apply)函数

pandas使用apply函数:在dataframe数据行(row)上施加(apply)函数