2017-09-13 200 views
2

我想创建一个数据帧的列表,其中每个数据帧是3个较大的数据帧。创建切片数据帧的列表

dframes = [df[0:3], df[3:6],...,df[2000:2003]] 

我仍然相当新的节目,为什么:

x = 3 
    dframes = [] 
    for i in range(0, len(df)): 
     dframes = dframes.append(df[i:x]) 
     i = x 
     x = x + 3 

dframes = dframes.append(df[i:x]) 
AttributeError: 'NoneType' object has no attribute 'append' 
+2

只要使用'dframes.append(DF〔Ⅰ:X] )'ins tead'dframes = dframes.append(df [i:x])' – AndMar

回答

4

使用np.split

设置
考虑数据帧df

df = pd.DataFrame(dict(A=range(15), B=list('abcdefghijklmno'))) 

dframes = np.split(df, range(3, len(df), 3)) 

输出

for d in dframes: 
    print(d, '\n') 

    A B 
0 0 a 
1 1 b 
2 2 c 

    A B 
3 3 d 
4 4 e 
5 5 f 

    A B 
6 6 g 
7 7 h 
8 8 i 

    A B 
9 9 j 
10 10 k 
11 11 l 

    A B 
12 12 m 
13 13 n 
14 14 o 
+0

这正是我一直在寻找的。感谢您快速简洁的回答! – jchan

2

的Python提出这个错误,因为函数append回报None和你的战利品可变dframes下一次会None

您可以使用这个:

[list(dframes[i:i+3]) for i in range(0, len(dframes), 3)] 
2

您可以通过numpy array使用列表理解与groupby通过length of index地板由3分发布:

np.random.seed(100) 
df = pd.DataFrame(np.random.randint(10, size=(10,5)), columns=list('ABCDE')) 
print (df) 
    A B C D E 
0 8 8 3 7 7 
1 0 4 2 5 2 
2 2 2 1 0 8 
3 4 0 9 6 2 
4 4 1 5 3 4 
5 4 3 7 1 1 
6 7 7 0 2 9 
7 9 3 2 5 8 
8 1 0 7 6 2 
9 0 8 2 5 1 

dfs = [x for i, x in df.groupby(np.arange(len(df.index)) // 3)] 
print (dfs) 
[ A B C D E 
0 8 8 3 7 7 
1 0 4 2 5 2 
2 2 2 1 0 8, A B C D E 
3 4 0 9 6 2 
4 4 1 5 3 4 
5 4 3 7 1 1, A B C D E 
6 7 7 0 2 9 
7 9 3 2 5 8 
8 1 0 7 6 2, A B C D E 
9 0 8 2 5 1] 

如果默认单调指数(0,1,2 ......)解决方案可以简化:

dfs = [x for i, x in df.groupby(df.index // 3)]