【问题标题】:How to keep x highest person correlation valued pairs of genes for each gene in a csv file in python?python - 如何在python的csv文件中为每个基因保留x个最高人相关值的基因对?
【发布时间】:2020-09-06 19:01:22
【问题描述】:
我有一个包含数千行格式如下的 csv 文件:
geneA geneB value
a b 5
a c 3
a d 7
b c 8
b d 1
我想为每个基因提取与其他基因在最高值方面最匹配的两个。对于前一个例子,基因 a 和 b 的结果是:
a d 7
a b 5
b c 8
b a 5
基于answer,我得到了部分我想要的结果,因为它不测试第一列和第二列,而只测试第一列。所以结果是不正确的,即它在检查 b 的最佳值时没有考虑a b 5 行。
任何想法我能做什么?
【问题讨论】:
标签:
python
pandas
dataframe
csv
【解决方案1】:
您可以交换geneA、geneB 并连接到数据框,然后按value 排序并使用groupby().head():
total_df = pd.concat([df, df.rename(columns={'geneA':'geneB','geneB':'geneA'})])
(total_df.sort_values(['geneA','value'], ascending=[True,False])
.groupby('geneA').head(2)
)
输出:
geneA geneB value
2 a d 7
0 a b 5
3 b c 8
0 b a 5
3 c b 8
1 c a 3
2 d a 7
4 d b 1
【解决方案2】:
下面将为您提供基于 value 列的每个 gene 的前 2 个值。
In [1093]: A = df.groupby('geneA')['value'].nlargest(2).reset_index()
In [1096]: A.rename(columns={'geneA': 'gene'}, inplace=True)
In [1097]: B = df.groupby('geneB')['value'].nlargest(2).reset_index()
In [1098]: B.rename(columns={'geneB': 'gene'}, inplace=True)
In [1102]: d = A.append(B)
In [1111]: d.groupby('gene')['value'].nlargest(2).reset_index().drop('level_1', 1)
Out[1111]:
gene value
0 a 7
1 a 5
2 b 8
3 b 5
4 c 8
5 c 3
6 d 7
7 d 1