我试图计算值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的次数并从频率中得出直方图。任何帮助,将不胜感激。
答案 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