Преобразование с помощью Python значений из столбца в значения в строке, разделенные др. от друга запятыми

Рейтинг: 0Ответов: 3Опубликовано: 31.01.2023

Добрый день уважаемые коллеги, про помочь разобраться в решении следующей задачи. У меня есть перечень значений (кодов товаров, кот. более 10000 тыс. ед.) в столбце листа Excel. Моей задачей является превращение этого столбца в таблицу таким образом, чтобы значения друг от друга были разделены запятыми в строке, и самих значений в одной строке было 100 ед. Например, есть такой столбец с данными:

       Товар.Код
 0     152
 1     153
 2     154
 3     155
 4     156
 ...
 10000  745

Хотел получит такую таблицу:

152, 153, 154, 155, 156
252, 253, 254, 255, 256
...
(100-ая строка) 741,742,743,744,745

Для этого, насколько мне позволяют начальные знания Python, пишу следующий код:

import pandas as pd
rt_df_1 = pd.read_excel('C:\\Users\\...\\список.xlsx', sheet_name='Лист1') 
rt=rt_df_1.transpose()

и получаю строку (таблицу) вида:

            0   1   2   3   4
Товар.Код   152 153 154 155 156

далее пытаюсь применить костыльный способ поставить запятые:

print('152 {} 153 {} 154 {} 155 {} 156'.format(','))

и получаю ошибку вида:

IndexError: tuple index out of range

Прошу помочь разбить один большой столбец данных на столбец со значениями в строке в 100 ед. и разделенных друг от друга запятыми.

Ответы

▲ 1

Можно изменить "геометрию" массива с помощью np.reshape():

import pandas as pd
df = pd.read_excel(r'c:\test\список.xlsx', sheet_name='Лист1',header=None)
df = pd.DataFrame(df.values.reshape(-1,100)) # потребуется доп. обработка, если количество значений не кратно 100
df.to_csv(r'c:\test\список.csv',header=None,index=None)

На входе: столбец в Excel.
На выходе:
введите сюда описание изображения

Дополнение. Один из вариантов решения при кол-ве значений, некратных 100 - дополнить до количества, кратного 100, например, нулями:

import pandas as pd
import numpy as np

df = pd.read_excel(r'c:\test\список.xlsx', sheet_name='Лист1', header=None)
rest = (100 - df.shape[0] % 100) % 100
df = pd.DataFrame(np.append(df.values, np.repeat(0, rest)).reshape(-1, 100))
df.to_csv(r'c:\test\список.csv', header=None, index=None)

Вариант с resize():

import pandas as pd # pandas здесь только для ввода/вывода из Excel / в CSV
import numpy as np

df = pd.read_excel(r'c:\test\список.xlsx', sheet_name='Лист1', header=None)
v = np.array(df.values) # во избежание ошибки "массив не владеет своими данными"
v.resize((v.shape[0] // 100 + min(v.shape[0] % 100, 1), 100)) # преобразование "на месте"
pd.DataFrame(v).to_csv(r'c:\test\список.csv', header=None, index=None)
▲ 0

Можно сделать так:

генерируем датафрейм

import pandas as pd
import numpy as np

l = np.random.randint(0, 351, 300)
df = pd.DataFrame(l)

получили датафрейм с 350 рядами чисел. далее:

df_100 = [df.iloc[i:i+100, :] for i in range(0, len(df), 100)] # разбиваем по 100
for i in range(0, len(df_100)):   # пишем в csv-файлы
    df_100[i].T.to_csv(f"df-{i}.csv", index=False, header=False)

получаем csv-файлы вида "df-0.csv"

Для данного примера он будет выглядеть типа такого:

163,337,163,320,196,199,253,206,262,189,105,341,120,140... и далее до сотого значения
▲ 0

Будем считать, что у вас уже есть строка (вектор 152...10000). Я получу эту строку искусственно:

numer_set = [x for x in range(152, 10001)]

Тогда

for i in numer_set:
    print(str(i)+',', end=' ')
    k+=1
    if k == 100:
        print('\b')
        k=0

даст нужное вам.