我有一个只有一列的数据集。我想将该列切成多个数据框。
我使用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)
所以我想创建一个循环,将数据帧在列表中存储的位置切成多个帧。
谢谢!
答案 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
总计少于像素总数,它将把它们加到最后一行。由于您没有在问题中指定这两个条件中的任何一个,因此不确定要如何处理。