我正在尝试迭代或创建一个循环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列。
请帮忙!我不知道如何创建一个功能,它将覆盖每一列并执行此操作。我一直在考虑使用合并功能,但我不知道如何做到这一点。 谢谢!
答案 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