Преобразование с помощью Python значений из столбца в значения в строке, разделенные др. от друга запятыми
Добрый день уважаемые коллеги, про помочь разобраться в решении следующей задачи. У меня есть перечень значений (кодов товаров, кот. более 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 ед. и разделенных друг от друга запятыми.
Ответы (3 шт):
Можно сделать так:
генерируем датафрейм
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... и далее до сотого значения
Будем считать, что у вас уже есть строка (вектор 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
даст нужное вам.
Можно изменить "геометрию" массива с помощью 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)