Python 分组及;通过多列聚合大型数据集

Python 分组及;通过多列聚合大型数据集,python,python-3.x,pandas,numpy,pandas-groupby,Python,Python 3.x,Pandas,Numpy,Pandas Groupby,我试图将数据按多列分组,然后在其他列中聚合值。虽然我在网上找到了许多这样的例子,但当我尝试将相同的实践应用到我的数据框架时,我遇到了一些问题。我想这可能是因为尺寸(1.5mm+行) 我有一个带有姓名和地址信息的DataFrame,以及两个“源”列: In [45]: df Out[45]: Firstname Lastname Address Zip5 Source_A Source_B 0 'John' 'Smith' '1 May S

我试图将数据按多列分组,然后在其他列中聚合值。虽然我在网上找到了许多这样的例子,但当我尝试将相同的实践应用到我的
数据框架时,我遇到了一些问题。我想这可能是因为尺寸(1.5mm+行)

我有一个带有姓名和地址信息的
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\u A
Source\u B
采用原始数据帧的最大值


然而,虽然这可以在较小的数据帧上运行,但代码并不能在非常大的数据集(1.5mm行)上运行。大约45分钟前,我在一个大数据集上运行了这段代码,但它还没有完成。有没有更有效的方法?我也很好奇为什么用
df.duplicated(['Firstname','Lastname','Address','Zip5'],keep='last')
来简单地识别重复项非常快,而
groupby
却很困难

我不知道这是否会更快,因为我不知道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()

希望有帮助

对数百万条记录进行分组和排序需要一些时间,底层数据库表上是否有索引?如果不是,考虑基于QueQuy创建视图,也许在使用GROMPBY之前尝试排序?code>df.sort_值(['Firstname','Lastname','Address','Zip5'],inplace=True)
一个100K行子集需要多少时间?另外,在
groupby()
每列中有多少唯一的值?您可以不使用
作为
索引运行它吗?如果它不能在50分钟内完成,那么它很可能是pandas中的错误/次优实现。在这种情况下,您可以通过将较小的子集分组、连接并再次分组来解决问题