pandas group by column size

时间:2015-03-26 17:59:08

标签: python pandas dataframe group-by

我有多个巨大的tsv文件,我正在尝试使用pandas进行处理。我想按'col3'和'col5'进行分组。我试过这个:

import pandas as pd
df = pd.read_csv('filename.txt', sep = "\t")
g1 = df.groupby(['col3', 'col5']).size()

到目前为止它工作正常并打印出如下输出:

yes AB12 1
    FG14 1
no  nn18 1
    pp76 1

我希望我的输出像:

yes 2
no  2

我希望能够聚合多个文件的输出,即能够同时按所有文件中的这两列进行分组,并打印一个常见输出,其总出现次数为“是”或'不'或任何属性都可以。

PS-假设我在col3中对col5中的给定值有重复。我希望它们合并为一个而不计算两次。换句话说,如果AB12有两行,并且两行在col5中都是yes,我希望脚本将其计为一个而不是两个。

更新:

我通过执行以下操作删除了重复项:

g2 = df.drop_duplicates(['col3', 'col5'])
g3 = g2.groupby(['col3', 'col5']).size().sum(level=0)
print g3

我现在想一次在多个文件上使用groupby。如果文件没有这些列中的一个,则应该跳过它,我们应该转到下一个文件。

2 个答案:

答案 0 :(得分:1)

sum()接受level参数,因此您可以编写

df.groupby(['col3', 'col5']).size().sum(level=0)

以汇总MultiIndex第一级的组大小(此处为'col3')。例如:

>>> df
          a    
yes AB12  1
    FG14  2
no  nn18  3
    pp76  1

>>> df.sum(level=0)
     a    
no   4
yes  3

答案 1 :(得分:0)

在ajcr的答案和附加行的帮助下,我能够通过执行

删除基于两列的重复项
import pandas as pd
df = pd.read_csv('filename.txt', sep = "\t")
g2 = df.drop_duplicates(['col3', 'col5'])
g3 = g2.groupby(['col3', 'col5']).size().sum(level=0)
print g3