我有一个我用python pandas读到的excel数据:
import pandas as pd
data = pd.read_csv('..../file.txt', sep='\t')
这里我显示的是模拟数据,因为我的实际数据非常大:
data = {'ID': [0,1,2,3,4,5,6,2],
'VGene': ['IGHV1-J','IGHV1-J','IGHV2-J','IGHV2-J','IGHV1-J','IGHV1-J','IGHV2-J','IGHV2-J'],
'JGene':['IGHJ4-1','IGHJ4-1','IGHJ5-1','IGHJ5-1', 'IGHJ4-1','IGHJ4-1','IGHJ5-1','IGHJ5-1'],
'seq': ['AAAAAA','AAAAAC','TTTTTT','GGGGGG','AAAAAA','AAAAAC','TTTTTT','GGGGGG']}
data = DataFrame(data)
Out[13]:
ID VGene JGene seq
0 0 IGHV1-J IGHJ4-1 AAAAAA
1 1 IGHV1-J IGHJ4-1 AAAAAC
2 2 IGHV2-J IGHJ5-1 TTTTTT
3 3 IGHV2-J IGHJ5-1 GGGGGG
4 4 IGHV1-J IGHJ4-1 AAAAAA
5 5 IGHV1-J IGHJ4-1 AAAAAC
6 6 IGHV2-J IGHJ5-1 TTTTTT
7 2 IGHV2-J IGHJ5-1 GGGGGG
现在我只想为每个VGene和JGene组合输出VGene,JGene,ID和seq:
def printoutput(sgrp):
return print(sgrp["ID"].unique(),sgrp["VGene"].unique(), sgrp['JGene'].unique(), sgrp['seq'].unique())
data.groupby(["VGene", "JGene"]).apply(printoutput)
输出:
[0 1 4 5] ['IGHV1-J'] ['IGHJ4-1'] ['AAAAAA' 'AAAAAC']
[0 1 4 5] ['IGHV1-J'] ['IGHJ4-1'] ['AAAAAA' 'AAAAAC']
[2 3 6] ['IGHV2-J'] ['IGHJ5-1'] ['TTTTTT' 'GGGGGG']
似乎没错,只是它打印出第一个组合两次:
[0 1 4 5] ['IGHV1-J'] ['IGHJ4-1'] ['AAAAAA' 'AAAAAC']
[0 1 4 5] ['IGHV1-J'] ['IGHJ4-1'] ['AAAAAA' 'AAAAAC']
我尝试使用更大的数据集,同样的事情发生了,第一个实例总是被打印两次。任何关于为什么的想法?
答案 0 :(得分:3)
正如groupby.apply
的文档所述:
在当前实现中,在第一个组上应用调用func两次,以确定它是否可以采用快速或慢速代码路径。如果func有副作用,这可能会导致意外行为,因为它们将对第一组生效两次。
我只是使用一个老式的循环来继续我的一天:
>>> for k,g in df.groupby(["VGene", "JGene"]):
... printoutput(g)
...
[0 1 4 5] ['IGHV1-J'] ['IGHJ4-1'] ['AAAAAA' 'AAAAAC']
[2 3 6] ['IGHV2-J'] ['IGHJ5-1'] ['TTTTTT' 'GGGGGG']
(请注意,您的printoutput
函数无需返回任何内容;此时,由于print
返回None,它返回的内容与根本没有return
。)