#python #pandas #file-io #xlsxwriter
Вопрос:
У меня есть большой фрейм данных с примерно 2 миллионами строк со следующими функциями:
'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 A-Z), на групповые кластеры неравного размера, но менее 500 тыс. строк в каждом кластере, и экспортировать файлы в .xlsx
(Но файлы не должны разделять данные одной компании на 2 файла).
Скажем, файл 1 содержит названия компаний, содержит данные компании, начинающиеся с цифр (0-9), файл 2 содержит данные компании, начинающиеся с букв A-F .. и так далее и тому подобное.
Комментарии:
1. К вашему сведению для будущих читателей, Лакх / Лак = 100 000. Таким образом, 500 000 строк в кластере.
Ответ №1:
Давайте начнем с этого фиктивного набора данных:
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
Сначала нам нужно сгруппировать компании по их первой букве (здесь цифры/A-L/K-Z).:
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')