计算值1出现在VCF的每一行中转换为pandas数据帧的次数

时间:2016-06-06 18:49:11

标签: pandas dataframe count

我试图计算值1出现在转换为数据帧的Vcf的每一行中的次数。

#CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  A01_01  A01_02  A01_03  A01_04  A01_05
chr01   27915   27915   T   C   .   .   .   GT  0   1   0   0   1
chr01   28323   28323   G   A   .   .   .   GT  0   1   0   0   1
chr01   28652   28652   G   T   .   .   .   GT  0   1   0   0   1
chr01   29667   29667   C   A   .   .   .   GT  0   1   0   0   1
chr01   30756   30756   C   G   .   .   .   GT  0   1   0   0   1
chr01   31059   31059   G   A   .   .   .   GT  0   1   0   0   1
chr01   31213   31213   G   A   .   .   .   GT  0   1   0   0   1
chr01   31636   31636   T   C   .   .   .   GT  0   1   0   0   1
chr01   31756   31756   C   T   .   .   .   GT  0   1   0   0   1
chr01   31976   31976   C   T   .   .   .   GT  0   1   0   0   1

这就是VCF在excel中的样子。但是有了更多的行和列,额外的列只是更多的基因型,行是更多的位置和等位基因。 我试图使用python脚本计算它们。我已使用data = pd.read_table(“....”)成功将Vcf转换为pandas数据帧 我知道我应该使用count函数,但我无法让它计入我想要的行数。最终目标是制作显示每个等位基因频率的直方图。 (1表示它有0意味着它不是)因此我想计算每行中出现1的次数并从频率中得出直方图。任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:0)

我知道有两种方法可以使用pandas中的sum function。它允许你获取行中每个数字类型单元格的总和(所以,如果你有一列ID字符串,它看起来你可能会这样做,它会跳过那些)。如果您数据中唯一的数字是1和0,或者您可以轻松删除任何其他数字列,那么您就可以了。

我无法真正解析您的示例数据,所以让我们举一些例子:

df = pd.DataFrame(np.random.randint(0,2, size=(100,4)), columns=list('ABCD'))

有了这些数据,如果你想添加一个额外的列,它是每行的总和:

df['Sum'] = df.sum(1, skipna=True, numeric_only=True)

或者您可以将其分配给变量本身。无论哪种方式,您都可以将这些计数提供给您喜欢的绘图包以制作直方图。

如果您的数据更复杂并且数字不是1,那么您可以先采用创建布尔数据框的中间步骤,因此如果单元格的值为1则为真,否则为&# 39; s错。因此,让我们制作另一个随机数据框:

df2 = pd.DataFrame(np.random.randint(0,10, size=(100,4)), columns=list('ABCD'))

这是随机的0-9。现在让我们制作一个中间数据帧:

df2_bool = (df2 == 1)

现在我们可以再次做到这一点:

df2['Sum'] = df2_bool.sum(1, skipna=True, numeric_only=True)

现在你已经掌权了!

这可能是一个更好的方法,但这就是我一直在做的事情,而且它很适合我。

答案 1 :(得分:0)

IIUC,你可以这样做:

In [45]: df.filter(like='A01').sum(axis=1)
Out[45]:
0    2
1    2
2    2
3    2
4    2
5    2
6    2
7    2
8    2
9    2
dtype: int64


In [44]: df.filter(like='A01')
Out[44]:
   A01_01  A01_02  A01_03  A01_04  A01_05
0       0       1       0       0       1
1       0       1       0       0       1
2       0       1       0       0       1
3       0       1       0       0       1
4       0       1       0       0       1
5       0       1       0       0       1
6       0       1       0       0       1
7       0       1       0       0       1
8       0       1       0       0       1
9       0       1       0       0       1