通过多列对大型数据集进行分组和聚合

时间:2019-04-22 19:35:30

标签: python python-3.x pandas numpy pandas-groupby

我正在尝试按多列对数据进行分组,然后在其他列中汇总值。虽然我在网上找到了许多示例,但是当我尝试将相同的做法应用于DataFrame时遇到了问题。我认为这可能是由于尺寸(1.5毫米以上的行)引起的。

我有一个DataFrame,其中包含姓名和地址信息,以及两个“来源”列:

In [45]: df
Out[45]:
   Firstname   Lastname       Address     Zip5   Source_A  Source_B
0      'John'    'Smith'    '1 May St'  '10001'         1         0
1       'Lou'    'Brown'  '2 Perry Ln'  '20983'         0         1
2    'Elaine'    'Brown'  '5 Park Ave'  '34785'         1         0
3      'John'    'Smith'    '1 May St'  '10001'         0         1

我希望将具有相似名称和地址信息的行分组,然后使用max()函数汇总“源”列。我的代码如下:

In [43]: grouped = df.groupby(['Firstname', 'Lastname', 'Address', 'Zip5'], as_index = False, sort = False)

In [44]: grouped.max()
Out[44]:
   Firstname   Lastname       Address     Zip5   Source_A  Source_B
0      'John'    'Smith'    '1 May St'  '10001'         1         1
1       'Lou'    'Brown'  '2 Perry Ln'  '20983'         0         1
2    'Elaine'    'Brown'  '5 Park Ave'  '34785'         1         0

此输出正是我想要的-本质上,在['Firstname', 'Lastname', 'Address', 'Zip5']上对行进行了重复数据删除,其中Source_ASource_B占据了原始数据帧的最大值。

但是,尽管这在较小的DataFrame上有效,但是代码无法在非常大的数据集(1.5毫米行)上运行。大约45分钟前,我在大型数据集上运行了此代码,但尚未完成。有更有效的方法吗?我也很好奇为什么为什么简单地用df.duplicated(['Firstname', 'Lastname', 'Address', 'Zip5'], keep = 'last')标识重复项却却很快groupby却很困难。

1 个答案:

答案 0 :(得分:0)

我不知道这样做是否会更快,因为我不知道是否pivot_table或melt或两者的组合都比使用groupby快,但这是一个替代解决方案

我使用了melt函数将Source_A和Source_B中的值堆叠到一列中

df_melt=pd.melt(df,id_vars=['Firstname','Lastname','Address','Zip5'],value_vars=['Source_A','Source_B'])

然后将数据透视表应用于结果

df_pivot=df_melt.pivot_table(index=['Firstname','Lastname','Address','Zip5'],columns='variable',aggfunc='max').reset_index()

希望有帮助!