在Python中分离Pandas DataFrame的元素

时间:2016-06-11 09:58:05

标签: python pandas dataframe

我有一个pandas DataFrame,如下所示:

    Time  Measurement
0      0            1
1      1            2
2      2            3
3      3            4
4      4            5
5      0            2
6      1            3
7      2            4
8      3            5
9      4            6
10     0            3
11     1            4
12     2            5
13     3            6
14     4            7
15     0            1
16     1            2
17     2            3
18     3            4
19     4            5
20     0            2
21     1            3
22     2            4
23     3            5
24     4            6
25     0            3
26     1            4
27     2            5
28     3            6
29     4            7

可以使用以下代码生成:

import pandas
time=[0,1,2,3,4]
repeat_1_conc_1=[1,2,3,4,5]
repeat_1_conc_2=[2,3,4,5,6]
repeat_1_conc_3=[3,4,5,6,7]
d1=pandas.DataFrame([time,repeat_1_conc_1]).transpose()
d2=pandas.DataFrame([time,repeat_1_conc_2]).transpose()
d3=pandas.DataFrame([time,repeat_1_conc_3]).transpose()
repeat_2_conc_1=[1,2,3,4,5]
repeat_2_conc_2=[2,3,4,5,6]
repeat_2_conc_3=[3,4,5,6,7]
d4=pandas.DataFrame([time,repeat_2_conc_1]).transpose()
d5=pandas.DataFrame([time,repeat_2_conc_2]).transpose()
d6=pandas.DataFrame([time,repeat_2_conc_3]).transpose()
df= pandas.concat([d1,d2,d3,d4,d5,d6]).reset_index()
df.drop('index',axis=1,inplace=True)
df.columns=['Time','Measurement']
print df

如果查看代码,您会看到我在同一个DataFrame中有两个实验性重复,应该在df.iloc[:15]分隔。此外,在每个实验中,我有3个子实验,可以被认为是剂量反应的起始条件,即第一个子实验以1开始,第二个以2开始,第三个以3开始。这些应以索引间隔分开。 `len(time)',每个实验重复为0-4,5个元素。有人可以告诉我将这些数据分成每个实验的个别时间进程测量的最佳方法吗?我不确定最佳数据结构是什么,但我只需要能够轻松访问每个实验重复的每个子实验的每个数据。也许有时会像:

repeat1=
    Time  Measurement
0      0            1
1      1            2
2      2            3
3      3            4
4      4            5


5      0            2
6      1            3
7      2            4
8      3            5
9      4            6


10     0            3
11     1            4
12     2            5
13     3            6
14     4            7

Repeat 2=
      Time  Measurement
15     0            1
16     1            2
17     2            3
18     3            4
19     4            5


20     0            2
21     1            3
22     2            4
23     3            5
24     4            6


25     0            3
26     1            4
27     2            5
28     3            6
29     4            7

1 个答案:

答案 0 :(得分:1)

IIUC,您可以设置多索引,以便您可以轻松索引DF访问实验和子实验:

In [261]: dfi = df.set_index([df.index//15+1, df.index//5 - df.index//15*3 + 1])

In [262]: dfi
Out[262]:
     Time  Measurement
1 1     0            1
  1     1            2
  1     2            3
  1     3            4
  1     4            5
  2     0            2
  2     1            3
  2     2            4
  2     3            5
  2     4            6
  3     0            3
  3     1            4
  3     2            5
  3     3            6
  3     4            7
2 1     0            1
  1     1            2
  1     2            3
  1     3            4
  1     4            5
  2     0            2
  2     1            3
  2     2            4
  2     3            5
  2     4            6
  3     0            3
  3     1            4
  3     2            5
  3     3            6
  3     4            7

选择子实验

In [263]: dfi.loc[1,1]
Out[263]:
     Time  Measurement
1 1     0            1
  1     1            2
  1     2            3
  1     3            4
  1     4            5

In [264]: dfi.loc[2,2]
Out[264]:
     Time  Measurement
2 2     0            2
  2     1            3
  2     2            4
  2     3            5
  2     4            6

选择所有子实验的第二个实验:

In [266]: dfi.loc[2,:]
Out[266]:
   Time  Measurement
1     0            1
1     1            2
1     2            3
1     3            4
1     4            5
2     0            2
2     1            3
2     2            4
2     3            5
2     4            6
3     0            3
3     1            4
3     2            5
3     3            6
3     4            7

或者您可以创建自己的切片功能:

def my_slice(rep=1, subexp=1):
    rep -= 1
    subexp -= 1
    return df.ix[rep*15 + subexp*5 : rep*15 + subexp*5 + 4, :]

演示:

In [174]: my_slice(1,1)
Out[174]:
   Time  Measurement
0     0            1
1     1            2
2     2            3
3     3            4
4     4            5

In [175]: my_slice(2,1)
Out[175]:
    Time  Measurement
15     0            1
16     1            2
17     2            3
18     3            4
19     4            5

In [176]: my_slice(2,2)
Out[176]:
    Time  Measurement
20     0            2
21     1            3
22     2            4
23     3            5
24     4            6

PS更方便的连接DF的方法:

df = pandas.concat([d1,d2,d3,d4,d5,d6], ignore_index=True)

因此您不需要以下.reset_index()drop()