我认为这可能是因为列中使用了不同的类型,但我在下面创建了一个示例,它适用于混合列类型。唯一真正不同的是大小 - 这就是为什么我认为你可能内存不足。
工作示例
我使用int
,str
和datetime
对象:
In [1]: import pandas as pd
In [2]: import datetime
In [3]: df = pd.DataFrame({'Branch': 'A A A A A A A B'.split(),
'Buyer': 'Carl Mark Carl Carl Joe Joe Joe Carl'.split(),
'Quantity': [1, 3, 5, 1, 8, 1, 9, 3],
'Date':[datetime.datetime(2013, 1, 1, 13, 0),
datetime.datetime(2013, 1, 1, 13, 5),
datetime.datetime(2013, 10, 1, 20, 0),
datetime.datetime(2013, 10, 2, 10, 0),
datetime.datetime(2013, 10, 1, 20, 0),
datetime.datetime(2013, 10, 2, 10, 0),
datetime.datetime(2013, 12, 2, 12, 0),
datetime.datetime(2013, 12, 2, 14, 0)]})
In [4]: df
Out[4]:
Branch Buyer Quantity Date
0 A Carl 1 2013-01-01 13:00:00
1 A Mark 3 2013-01-01 13:05:00
2 A Carl 5 2013-10-01 20:00:00
3 A Carl 1 2013-10-02 10:00:00
4 A Joe 8 2013-10-01 20:00:00
5 A Joe 1 2013-10-02 10:00:00
6 A Joe 9 2013-12-02 12:00:00
7 B Carl 3 2013-12-02 14:00:00
In [5]: df.shape
Out[5]: (8, 4)
现在我只是再次重复数据框,但为每个日期时间值添加一小时,只是为了增加预期的 groupby 组合的数量:
In [14]: df.iloc[0:8, 3] += datetime.timedelta(hours=1)
现在对所有列执行分组,并且只求和Quantity
(这是我唯一的数字列)。
结果符合预期:
In [16]: df.groupby(["Branch", "Buyer", "Quantity", "Date"])["Quantity"].sum()
Out[16]:
Branch Buyer Quantity Date
A Carl 1 2013-01-01 13:00:00 1
2013-01-01 14:00:00 1
2013-10-02 10:00:00 1
2013-10-02 11:00:00 1
5 2013-10-01 20:00:00 5
2013-10-01 21:00:00 5
Joe 1 2013-10-02 10:00:00 1
2013-10-02 11:00:00 1
8 2013-10-01 20:00:00 8
2013-10-01 21:00:00 8
9 2013-12-02 12:00:00 9
2013-12-02 13:00:00 9
Mark 3 2013-01-01 13:05:00 3
2013-01-01 14:05:00 3
B Carl 3 2013-12-02 14:00:00 3
2013-12-02 15:00:00 3
Name: Quantity, dtype: int64
分解你的问题
可能很难分解您的问题,因为您需要对 groupby 操作的整个数据。但是,您可以将每个组保存到磁盘,mean()
分别对它们执行计算并自己合并结果。每个组的名称实际上是groupby
所选列的组合。这可用于构建重用数据帧的索引。
它可能看起来像这样:
for name, group in df1.groupby(['date', 'unit', 'company', 'city']):
print("Processing groupby combination: ", name) # This is the current groupby combination
result = group.mean()
_df = pd.DataFrame(index=[name], data=[result])
_df.to_csv("path/somewhere/" + name + ".csv
然后,您将拥有一个文件夹,其中包含每个组的结果,您只需将它们读回并合并它们即可。
其他方法
众所周知,Pandas 不能非常有效地处理大量数据集上的许多操作(与例如data.table
包相比)。有Dask包,它本质上是以分布式方式执行 Pandas 的事情,但这可能有点矫枉过正(你当然需要更多的资源!)