首页 > 解决方案 > 将大熊猫数据框分组对象按字母数字(0-9 AZ)拆分为大小不等的组集群,但每个集群中的行数少于 500k

问题描述

我有一个包含大约 200 万行的大型数据框,具有以下功能:

'Month', 'Company name', 'Country', 'State', 'Area code', 'SR Category', 'SR Status'

我根据公司名称对 df 进行了分组。

grouped_comp = df.groupby(by='Company name')

我知道我可以使用 for 循环来导出分组数据

for name, group in grouped_comp:
    group.to_excel('file_name.xlsx', writer='xlsxwriter')

现在我需要将这个 df 分组对象按字母数字(0-9 AZ) 拆分为大小不等的组集群,但每个集群中的行数少于 500k,并以.xlsx格式导出文件 (但是,文件不应拆分1 个公司数据分为 2 个文件)。比如说,文件 1 包含公司名称,其中包含以数字 (0-9)开头的公司数据,文件 2 包含以字母 AF .. 开头的公司数据,依此类推。

标签: pythonpandasfile-ioxlsxwriter

解决方案


让我们从这个虚拟数据集开始:

import numpy as np
import string
np.random.seed(42)
df = pd.DataFrame({'company': ['%scompany' % x for x in np.random.choice(list(string.ascii_uppercase+string.digits), size=100)],
                   'other': 'blah'})
>>> df.head()
    company other
0  2company  blah
1  Ocompany  blah
2  Hcompany  blah
3  Ucompany  blah
4  Scompany  blah

首先,我们需要按公司的第一个字母(此处为数字/AL/KZ)对公司进行分组:

group = (df['company']
           .str.extract('^(?P<digit>\d)|(?P<AL>[A-L])|(?P<KZ>[K-Z])')
           .stack()
           .index.get_level_values(1)
        )
>>> group
['AL', 'AL', 'AL', 'AL', 'KZ', 'KZ', 'KZ', 'AL', 'KZ', 'KZ', 'KZ', 'AL',
 'KZ', 'KZ', 'KZ', 'KZ', 'KZ', 'AL', 'AL', 'KZ', 'KZ', 'AL', 'KZ', 'AL',
...
 'KZ', 'KZ', 'AL', 'AL', 'AL', 'KZ', 'AL', 'digit', 'digit', 'digit',
 'AL', 'KZ', 'digit', 'KZ', 'KZ']

最后,我们像最初一样保存每个组,包括文件名中的组名:

for name, group in df.groupby(group):
    group.to_excel(f'group_{name}.xlsx', writer='xlsxwriter')

推荐阅读