我有两个时间值的测量数据,并具有副本:
name t value replicate
foo 1 0.5 a
foo 1 0.55 b
foo 1 0.6 c
foo 2 0.7 a
foo 2 0.71 b
foo 2 0.72 c
bar 1 0.1 a
bar 1 0.12 b
bar 1 0.3 c
bar 2 0.4 a
bar 2 0.45 b
bar 2 0.44 c我希望将其解析为dataframe,并获得每个时间点("t“列)和每个示例("name”列)副本的均值和标准差。这可以通过以下方式来完成:
df = pandas.read_table("data.txt",sep="\t")
g = df.groupby(["name", "t"])
new_df = g.agg([np.mean, np.std])问题是new_df有一个分层索引:
value
mean std
name t
bar 1 0.173333 0.110151
2 0.430000 0.026458
foo 1 0.550000 0.050000
2 0.710000 0.010000如果平均值和std值只是常规列,那么如何才能得到平面数据呢?我尝试过reset_index(),但这并不能做到:
>>> new_df.reset_index()
name t value
mean std
0 bar 1 0.173333 0.110151
1 bar 2 0.430000 0.026458
2 foo 1 0.550000 0.050000
3 foo 2 0.710000 0.010000我希望最后的dataframe有列:sample, t, mean, std (或value_mean, value_std)。怎样才能在熊猫身上做到这一点?
发布于 2016-03-31 19:07:53
我会做一些与MaxU略有不同的事情。尝试将索引重置为特定的列级别,然后删除其他列级别。
In [5]: new_df2 = new_df.copy()
In [6]: new_df2 = new_df2.reset_index(col_level=1)
In [7]: new_df2.columns = new_df2.columns.get_level_values(1) # same level=1
In [8]: new_df2
Out[8]:
name t mean std
0 bar 1 0.173333 0.110151
1 bar 2 0.430000 0.026458
2 foo 1 0.550000 0.050000
3 foo 2 0.710000 0.010000编辑:
使用MultiIndex,可以用于设置索引(垂直列)或列标签(情况)的多级排列,列标签存储为levels,其位置存储为labels。如下所示:
In [4]: df.columns
Out[4]:
MultiIndex(levels=[[u'value'], [u'mean', u'std']],
labels=[[0, 0], [0, 1]])通过执行reset_index(col_level=1),我们将MultiIndex转换为
In [5]: df.reset_index(col_level=1).columns
Out[5]:
MultiIndex(levels=[[u'value', u''], [u'mean', u'std', u't', u'name']],
labels=[[1, 1, 0, 0], [3, 2, 0, 1]])它将标签从索引中提取出来,并将它们放入列MultiIndex的第1级(第二个/较低级别)。然后,columns = columns.get_level_values(1)在第1级抓取列标签的值,并只将这些值设置为列标签,从而有效地删除级别0。
Out[6]: Index([u'name', u't', u'mean', u'std'], dtype='object')发布于 2016-03-31 18:14:51
尝试重命名您的列:
In [9]: new_df.reset_index(inplace=True)让我们以如下方式设置列名:如果存在level==1列,则选择它,否则使用带有level==0的列
In [14]: new_df.columns = [c[1] if c[1] else c[0] for c in new_df.columns.tolist()]
In [15]: new_df
Out[15]:
name t mean std
0 bar 1 0.173333 0.110151
1 bar 2 0.430000 0.026458
2 foo 1 0.550000 0.050000
3 foo 2 0.710000 0.010000https://stackoverflow.com/questions/36339960
复制相似问题