python - 将大熊猫数据框分组对象按字母数字(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 .. 开头的公司数据,依此类推。
解决方案
让我们从这个虚拟数据集开始:
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')
推荐阅读
- ubuntu - 如何在 Ubuntu 中打开新终端并从当前终端运行命令?
- reactjs - React Tree Org - 角色 ID
- timezone - 如何在 ubuntu 中更改我的本地时区,因为我的时区不适合真实情况?
- c# - Crystal Report 13 - 限制详细显示的记录数部分在每个组的末尾显示额外的页面
- prolog - 如何解决 Turbo Prolog 中的自由变量错误?
- react-native - 如何从一个屏幕跳转到另一个屏幕并从 ReactNative 的堆栈中清除所有其他屏幕?
- python - 提取单词/短语后跟一个短语
- python - 使用带注意的 LSTM 编码器解码器进行多输出预测
- c# - 如何创建用户类并注册新用户?
- python-3.x - 统计跨账户的EC2实例数