用列拆分pandas数据帧

时间:2017-01-25 10:25:04

标签: python pandas dataframe

我有一个包含大量列的数据框。我真正想要的是 创建/拆分数据框。例如:

生成TOY数据:

df = pd.DataFrame(np.arange(10),columns = ['x'])
df['y'] = np.arange(30,40,1)
df['1'] = np.random.rand(10)
df['2'] = np.random.rand(10)
df['3'] = np.random.rand(10)
df['4'] = np.random.rand(10)
df['5'] = np.random.rand(10)
  

df =

    x   y   1              2           3          4            5
0   0   30  0.047787    0.435396    0.926836    0.314469    0.477411
1   1   31  0.083536    0.258120    0.682284    0.025050    0.713777
2   2   32  0.201041    0.872864    0.050977    0.580314    0.185589
3   3   33  0.105833    0.974538    0.559265    0.128242    0.217965
4   4   34  0.146551    0.662001    0.936995    0.050702    0.249724
5   5   35  0.098615    0.854952    0.649501    0.509777    0.726458
6   6   36  0.387889    0.040331    0.902277    0.051822    0.354042
7   7   37  0.321591    0.823724    0.052266    0.081491    0.187576
8   8   38  0.983665    0.152271    0.530755    0.384810    0.844386
9   9   39  0.649185    0.776682    0.239589    0.654547    0.581337

我真正想要的是以如下所示的方式分割数据帧:

df1 =

    x   y   1
0   0   30  0.047787
1   1   31  0.083536
2   2   32  0.201041
3   3   33  0.105833
4   4   34  0.146551
5   5   35  0.098615
6   6   36  0.387889
7   7   37  0.321591
8   8   38  0.983665
9   9   39  0.649185

df2 =

    x    y    2
0   0   30  0.435396
1   1   31  0.25812
2   2   32  0.872864
3   3   33  0.974538
4   4   34  0.662001
5   5   35  0.854952
6   6   36  0.040331
7   7   37  0.823724
8   8   38  0.152271
9   9   39  0.776682

等等。由于我有大量的列,所以很难一个一个地完成。有没有更简单的方法呢?

提前谢谢你。

3 个答案:

答案 0 :(得分:3)

你可以设置 x y cols作为索引轴保持静态 然后跨列执行groupby

通过利用词典理解,循环遍历每个这样的群体。此外,最后reset_index将确保生成扁平的DF

df.set_index(['x','y'], inplace=True)
dfs = {i:grp.reset_index() for i, grp in df.groupby(np.arange(len(df.columns)), axis=1)}

生成的字典的键将构成可以查询的列名:

dfs[0]

enter image description here

dfs[1]

enter image description here

等等。

答案 1 :(得分:3)

您可以使用列表推导自动生成数据帧:

df_cuts = [df[['x', 'y', col]] for col in df.columns if col not in ['x', 'y']]

我在命令行中验证了输出:

for i in range(len(df_cuts)):
    print 'df %r:' % i
    print df_cuts[i]
    print '\n'

结果如下:

df 0:
   x   y         1
0  0  30  0.695465
1  1  31  0.425572
2  2  32  0.018986
3  3  33  0.165947
4  4  34  0.103120
5  5  35  0.069060
6  6  36  0.676640
7  7  37  0.492231
8  8  38  0.950436
9  9  39  0.156195


df 1:
   x   y         2
0  0  30  0.928538
1  1  31  0.019624
2  2  32  0.862811
3  3  33  0.289581
4  4  34  0.150975
5  5  35  0.835313
6  6  36  0.768760
7  7  37  0.396042
8  8  38  0.423745
9  9  39  0.268596


df 2:
   x   y         3
0  0  30  0.999175
1  1  31  0.004125
2  2  32  0.137457
3  3  33  0.042903
4  4  34  0.580698
5  5  35  0.663723
6  6  36  0.996608
7  7  37  0.960361
8  8  38  0.932486
9  9  39  0.758873


df 3:
   x   y         4
0  0  30  0.708976
1  1  31  0.547635
2  2  32  0.722322
3  3  33  0.912707
4  4  34  0.380471
5  5  35  0.607742
6  6  36  0.803980
7  7  37  0.569364
8  8  38  0.882297
9  9  39  0.954743


df 4:
   x   y         5
0  0  30  0.900532
1  1  31  0.247818
2  2  32  0.629371
3  3  33  0.502218
4  4  34  0.183292
5  5  35  0.875611
6  6  36  0.940828
7  7  37  0.200641
8  8  38  0.874052
9  9  39  0.525997

答案 2 :(得分:1)

对我而言,您似乎可以将索引设置为['x','y'],然后按列名称获取列:

>>> df2 = df.set_index(['x','y'])
>>> df2
             1         2         3         4
x y                                         
0 30  0.161017  0.280965  0.058429  0.750003
1 31  0.643460  0.258441  0.951750  0.774355
2 32  0.948439  0.573363  0.126369  0.577629
3 33  0.896542  0.722825  0.927644  0.470369
4 34  0.298559  0.009676  0.841103  0.899220
5 35  0.855292  0.849880  0.529132  0.929805
6 36  0.428680  0.486381  0.271048  0.219826
7 37  0.752370  0.698653  0.980554  0.894405
8 38  0.027857  0.085865  0.086936  0.403528
9 39  0.522483  0.646266  0.825819  0.574025

>>> df2['1']
x  y 
0  30    0.161017
1  31    0.643460
2  32    0.948439
3  33    0.896542
4  34    0.298559
5  35    0.855292
6  36    0.428680
7  37    0.752370
8  38    0.027857
9  39    0.522483

如果你只需要遍历列,你可以这样做:

>>> for i in range(1,5):
...     print df[['x','y',str(i)]]
... 
   x   y         1
0  0  30  0.161017
1  1  31  0.643460
2  2  32  0.948439
3  3  33  0.896542
4  4  34  0.298559
5  5  35  0.855292
6  6  36  0.428680
7  7  37  0.752370
8  8  38  0.027857
9  9  39  0.522483
   x   y         2
0  0  30  0.280965
1  1  31  0.258441
2  2  32  0.573363
3  3  33  0.722825
4  4  34  0.009676
5  5  35  0.849880
6  6  36  0.486381
7  7  37  0.698653
8  8  38  0.085865
9  9  39  0.646266
   x   y         3
0  0  30  0.058429
1  1  31  0.951750
2  2  32  0.126369
3  3  33  0.927644
4  4  34  0.841103
5  5  35  0.529132
6  6  36  0.271048
7  7  37  0.980554
8  8  38  0.086936
9  9  39  0.825819
   x   y         4
0  0  30  0.750003
1  1  31  0.774355
2  2  32  0.577629
3  3  33  0.470369
4  4  34  0.899220
5  5  35  0.929805
6  6  36  0.219826
7  7  37  0.894405
8  8  38  0.403528
9  9  39  0.574025