将函数应用于所有列以从较大的文件中提取每个列值的等级并计算等级和

时间:2013-07-02 19:26:38

标签: python merge pandas extract

我正在尝试迭代或创建一个循环pandas数据框中的列的函数。此函数应该获取每列中的值,并搜索更大的文件以获取这些值。然后我希望它提取这些目标值的等级,并获得一个矢量,其中包含从所有100列中获得的值的总和。

100列文件名为simulation.txt,如下所示:

SIM0    SIM1    SIM2    ...SIM100
rs168   rs668   rs228   ...rs930
rs466   rs751   rs109   ...rs216
rs484   rs139   rs636   ...rs755
rs104   rs226   rs1540  ...rs671
rs123   rs377   rs732   ...rs672

我需要搜索的较大文件是rs_ranks.txt,它看起来像这样:

rsid    Rank
rs168   1
rs464   2
rs485   3
rs110   4
rs129   5
rs297   6
rs139   7
.       .
.       .
.       .
.       .
.       .
rs105   2498509

我想从simulation.txt中提取SIM0,然后我想从rs_ranks.txt中的SIM0获取rs号的等级。在我获得SIM0列中的rs数字的排名后,我想计算排名总和。

示例:如果我要从rs_ranks中提取SIM0的等级,我会得到这样的结果:

    SIM0    Rank
    rs168   1
    rs466   49
    rs484   398208
    rs104   402487
    rs123   2972

SIM0的秩和将是= 803717     rank_sum_vector(803717,SIM1_ranksum,SIM2_ranksum,SIM100_ranksum)

最后,我希望能够为所有100列模拟文本执行此操作,因此最后我得到了一个100个等级和值的rankum向量,对应于所有100列。

请帮忙!我不知道如何创建一个功能,它将覆盖每一列并执行此操作。我一直在考虑使用合并功能,但我不知道如何做到这一点。 谢谢!

1 个答案:

答案 0 :(得分:0)

您可以applymap使用Series get method

In [11]: res = df.applymap(rs.get)

In [12]: res
Out[12]:
   SIM0  SIM1  SIM2
0   388   386   491
1   148   471   171
2   162   261   276
3   910   780   445
4   952   673   367

然后sum

In [13]: df.sum()
Out[13]:
SIM0    2560
SIM1    2571
SIM2    1750
dtype: int64

(我使用了整数的随机序列rs,而不是你给的部分

要获取DataFrame和Series,您可以使用read_csv,如下所示:

In [31]: df = pd.read_csv('simulation.txt')

In [32]: rs = pd.read_csv('rs_ranks.txt').set_index('rsid')['Rank']

In [33]: rs
Out[33]:
rsid
rs168    1
rs464    2
rs485    3
rs110    4
rs129    5
rs297    6
rs139    7
Name: Rank, dtype: int64