我在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
答案 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