切割数据框循环

时间:2018-10-05 19:29:26

标签: python pandas

我有一个只有一列的数据集。我想将该列切成多个数据框。

我使用for循环创建一个列表,其中包含要剪切数据框的位置处的值。

import pandas as pd

df = pd.read_csv("column.csv", delimiter=";", header=0, index_col=(0))

number_of_pixels = int(len(df.index))

print("You have " + str(number_of_pixels) +" pixels in your file")
number_of_rows = int(input("Enter number of rows you want to create"))
list=[] #this list contains the number of pixels per row

for i in range (0,number_of_rows): #this loop fills the list with the number of pixels per row
    pixels_per_row=int(input("Enter number of pixels in row " + str(i)))
    list.append(pixels_per_row)

print(list)

在将列切成多个数据框后,我想转置每个数据框并使用以下命令将所有数据框缩回一起:

df1=df1.reset_index(drop=True) 
df1=df1.T 

df2=df2.reset_index(drop=True)
df2=df2.T

frames = [df1,df2]

result = pd.concat(frames, axis=0)

print(result) 

所以我想创建一个循环,将数据帧在列表中存储的位置切成多个帧。

谢谢!

1 个答案:

答案 0 :(得分:1)

使用numpy可以更好地解决此问题。从您收到用户输入的列表开始。重点是使用numpy.split根据请求的像素累积数量来分隔值,然后创建一个新的DataFrame

设置

import numpy as np
import pandas as pd

np.random.seed(123)
df = pd.DataFrame({'val': np.random.randint(1,10,50)})

lst = [4,10,2,1,15,8,9,1]

代码

pd.DataFrame(np.split(df.val.values, np.cumsum(lst)[:-1]))

输出

    0    1    2    3    4    5    6    7    8    9   10   11   12   13   14
0   3  3.0  7.0  2.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
1   4  7.0  2.0  1.0  2.0  1.0  1.0  4.0  5.0  1.0  NaN  NaN  NaN  NaN  NaN
2   1  5.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
3   2  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
4   8  4.0  3.0  5.0  8.0  3.0  5.0  9.0  1.0  8.0  4.0  5.0  7.0  2.0  6.0
5   7  3.0  2.0  9.0  4.0  6.0  1.0  3.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN
6   7  3.0  5.0  5.0  7.0  4.0  1.0  7.0  5.0  NaN  NaN  NaN  NaN  NaN  NaN
7   8  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN

如果列表中的像素多于初始DataFrame中的行总数,则输出中将得到所有NaN行的额外像素。如果您的lst总计少于像素总数,它将把它们加到最后一行。由于您没有在问题中指定这两个条件中的任何一个,因此不确定要如何处理。