如何在 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 函数的窗口