Python pandas:groupby输出重复

时间:2015-11-18 18:06:06

标签: python pandas

我有一个我用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']

我尝试使用更大的数据集,同样的事情发生了,第一个实例总是被打印两次。任何关于为什么的想法?

1 个答案:

答案 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。)