【问题标题】:Separating elements of a Pandas DataFrame in Python在 Python 中分离 Pandas DataFrame 的元素
【发布时间】:2016-06-12 05:25:48
【问题描述】:

我有一个如下所示的 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

【问题讨论】:

  • 什么是repeat1Repeat 2 - 数据帧?或者你只是想打印你的 DF 以这种方式分隔它?
  • 我不知道放入这些数据的最佳数据结构。但标准是我需要能够轻松访问每次重复的每个起始条件(子实验)

标签: python pandas dataframe


【解决方案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()

【讨论】:

  • 太棒了,正是我想要的。谢谢
  • @user3059024,不客气! :) 感谢您接受答案!
猜你喜欢
  • 2018-03-14
  • 2020-10-11
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
相关资源
最近更新 更多