Мне нужно нарезать большой набор данных в соответствии с определенной длиной. Я сделал код, но он занимает много времени на выполнение.
Во-первых, у меня есть фрейм данных, который состоит из значений, которые нужно нарезать большим набором данных.
df
sl no length_of each_column
1 3
2 20
3 30
4 40
5 50
Большой набор данных содержит около ста тысяч строк и выглядит примерно так
sl no values
0 10
1 20
3 30
4 40
5 50
6 60
7 10
8 49
9 59
10 20
and so on
Мой результирующий набор данных должен нарезать большой набор данных, взяв значения из фрейма данных, который содержит длину каждого столбца. Если предположить, что длина каждого столбца равна 3, то он должен разрезать большой набор данных на 3, затем двигаться вперед на одну строку, а затем снова разрезать 3 точки данных.
Снова двигайтесь вперед на одну строку и срезайте 3 точки данных и так далее, пока не будут получены все возможные комбинации требуемой длины.
Результирующий набор данных упоминается ниже
Результирующий набор данных, если его разделить на 3
Resultant data frame for column length 3
sl no col1 col2 col3 - - - - - - -
0 10 20 30
1 20 30 40
2 30 40 50
и так далее, пока он не составит все возможные комбинации длины 3.
@Kundan, можете ли вы опубликовать заголовок своего фрейма данных и желаемый результат?
@Kundan хорошо, вам нужно нарезать данные с постоянным шагом или создать все возможные комбинации, такие как [10,20,30], [10,40,50], [10,20,50] ...?
с постоянным шагом... если это 3, то сделать все возможные комбинации длины столбца 3... если это 10, делает все возможные комбинации длины столбца 10 из большего набора данных
Ну вот:
import pandas as pd
# setup test data
slice_options = {'length_of each_column': ['3', '5']}
slice_options = pd.DataFrame(data=slice_options)
data = {'values': ['1', '2', '3', '4', '5', '6', '7', '8', '9']}
data = pd.DataFrame(data=data)
# store data frames in list
out_data = list(range(slice_options.shape[0]))
count = 0
for index, row in slice_options.iterrows():
# create empty data frame
out_data[count] = pd.DataFrame()
# collect data
for i in range(data.shape[0]):
# select data rows
select_data = data.iloc[i:i+int(row.values[0])]
# handle rows number
if select_data.shape[0] == int(row.values[0]):
# fill data frame
out_data[count]['column' + str(i)] = select_data.values.ravel()
count += 1
Выход:
df1 (3 elements):
column0 column1 column2 column3 column4 column5 column6
0 1 2 3 4 5 6 7
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 9
df2 (5 elements):
column0 column1 column2 column3 column4
0 1 2 3 4 5
1 2 3 4 5 6
2 3 4 5 6 7
3 4 5 6 7 8
4 5 6 7 8 9
Он работает нормально.... но есть ли более быстрый способ сделать это... у меня около миллионов строк.... и нарезка данных с большим числом занимает много времени выполнения...
@Kundan, это решение с использованием фрейма данных pandas довольно быстрое, на данный момент я не пытаюсь найти более быстрое решение.
Не могли бы вы переформатировать отображение данных вашего фрейма данных?