切片大数据集的更快方法

时间:2019-05-31 07:01:56

标签: python dataframe

我需要根据某些特定长度对大型数据集进行切片。我已经编写了代码,但是执行时间很长。

首先,我有一个数据帧,该数据帧包含要分割的大型数据集的值。

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组合起来。

1 个答案:

答案 0 :(得分:0)

您在这里:

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
相关问题