重组Pandas DataFrame

时间:2016-04-19 15:04:40

标签: python pandas dataframe

我在python pandas数据框中有一些数据如下所示:

         Sample    Signal
225   TGBb_0m-2  1.943295
226   TGBb_5m-2  4.659431
227  TGBb_15m-2  1.713407
228  TGBb_30m-2  2.524867
229  TGBb_45m-2  2.776531
230  TGBb_90m-2  2.196248
231   TGBb_0m-1  2.329916
232   TGBb_5m-1  1.916303
233  TGBb_15m-1  3.892828
234  TGBb_30m-1  2.380105
235  TGBb_45m-1  2.667500
236  TGBb_90m-1  2.377786
237   TGBb_0m-3  1.836953
238  TGBb_15m-3  2.208754
239  TGBb_30m-3  1.561843
240  TGBb_45m-3  2.613384
241  TGBb_90m-3  2.081838

这里我有三个重复实验,每个实验有6个时间点,除了复制3只有5个。我想重新排序这个数据帧,使其按时间点分组,而不是实验。我认为最好的方法是将大数据帧拆分为由单个时间点的所有数据组成的较小数据帧。有谁知道我怎么能做到这一点?

例如,所需的输出可能如下所示:

         Sample    Signal
225   TGBb_0m-2  1.943295
231   TGBb_0m-1  2.329916
237   TGBb_0m-3  1.836953


         Sample    Signal
226   TGBb_5m-2  4.659431
232   TGBb_5m-1  1.916303    #missing third data point


227  TGBb_15m-2  1.713407
227  TGBb_15m-2  1.713407
238  TGBb_15m-3  2.208754

2 个答案:

答案 0 :(得分:1)

我认为您可以使用dataframe.group_by命令实现此目标。然而,您可能需要稍微更改列以分割实验的时间点和数量(例如,'TGBb_0m-2'必须在'Sample'列中的'TGBb_0m'和'your_new_column'栏中的'2'中拆分)

df = df.groupby(['Sample'],as_index = False)

请注意,这样您就可以创建一种特定类型的数据帧,这是一种groupby数据帧。因此,如果您想要打印它,只需键入它的名称就行不通,您必须使用:

df.head()

答案 1 :(得分:1)

您的数据(出于可重现的目的):

df = pd.DataFrame({'Sample': {225: 'TGBb_0m-2',
            226: 'TGBb_5m-2',
            227: 'TGBb_15m-2',
            228: 'TGBb_30m-2',
            229: 'TGBb_45m-2',
            230: 'TGBb_90m-2',
            231: 'TGBb_0m-1',
            232: 'TGBb_5m-1',
            233: 'TGBb_15m-1',
            234: 'TGBb_30m-1',
            235: 'TGBb_45m-1',
            236: 'TGBb_90m-1',
            237: 'TGBb_0m-3',
            238: 'TGBb_15m-3',
            239: 'TGBb_30m-3',
            240: 'TGBb_45m-3',
            241: 'TGBb_90m-3'},
 'Signal': {225: 1.943295,
            226: 4.659431,
            227: 1.713407,
            228: 2.524867,
            229: 2.7765310000000003,
            230: 2.1962479999999998,
            231: 2.329916,
            232: 1.9163029999999999,
            233: 3.8928279999999997,
            234: 2.380105,
            235: 2.6675,
            236: 2.377786,
            237: 1.8369529999999998,
            238: 2.208754,
            239: 1.561843,
            240: 2.613384,
            241: 2.0818380000000003}},
          columns=['Sample', 'Signal'])

由于您需要按Sample列中的部分文字进行分组,因此我可能会使用str.extract,如下所示:

df[['Time', 'Experiment']] = df['Sample'].str.extract(r'(.+)-(\d+)')

如果您想对“时间点”的数据帧执行操作,请执行此操作。我是一样的,我会使用for循环来过滤您的初始df,其中时间点相当于其中一个独特的时间段。

for time_period in df['Time'].unique():
  df_group = df[df['Time'] == time_period][['Sample', 'Signal']]
  print(df_group)

产生以下结果:

        Sample    Signal
225  TGBb_0m-2  1.943295
231  TGBb_0m-1  2.329916
237  TGBb_0m-3  1.836953
        Sample    Signal
226  TGBb_5m-2  4.659431
232  TGBb_5m-1  1.916303
         Sample    Signal
227  TGBb_15m-2  1.713407
233  TGBb_15m-1  3.892828
238  TGBb_15m-3  2.208754
         Sample    Signal
228  TGBb_30m-2  2.524867
234  TGBb_30m-1  2.380105
239  TGBb_30m-3  1.561843
         Sample    Signal
229  TGBb_45m-2  2.776531
235  TGBb_45m-1  2.667500
240  TGBb_45m-3  2.613384
         Sample    Signal
230  TGBb_90m-2  2.196248
236  TGBb_90m-1  2.377786
241  TGBb_90m-3  2.081838

如果您的目标只是按时间而不是通过实验重新排序数据框,那么在使用上面的str.extract后,您只需使用df.sort_values('Time')[['Sample', 'Signal']]即可获得以下结果:

         Sample    Signal
231   TGBb_0m-1  2.329916
237   TGBb_0m-3  1.836953
225   TGBb_0m-2  1.943295
233  TGBb_15m-1  3.892828
227  TGBb_15m-2  1.713407
238  TGBb_15m-3  2.208754
228  TGBb_30m-2  2.524867
234  TGBb_30m-1  2.380105
239  TGBb_30m-3  1.561843
229  TGBb_45m-2  2.776531
235  TGBb_45m-1  2.667500
240  TGBb_45m-3  2.613384
226   TGBb_5m-2  4.659431
232   TGBb_5m-1  1.916303
236  TGBb_90m-1  2.377786
230  TGBb_90m-2  2.196248
241  TGBb_90m-3  2.081838