Разделите большой фрейм данных pandas, сгруппированный альфа-численно (0-9 A-Z) в групповые кластеры неравного размера, но менее 500 тыс. строк в каждом кластере

#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')