Python 如何将数据聚合到平面数据帧(没有层次索引)?

Python 如何将数据聚合到平面数据帧(没有层次索引)?,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个重复时间值的测量数据: 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 我想将其解析为data

我有两个重复时间值的测量数据:

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
有一个层次索引:

如果平均值和标准值只是常规列,如何获得平面数据帧?我尝试了重置索引(),但没有成功:

>>> 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

我希望最后的数据框有以下列:
sample,t,mean,std
(或
value\u mean,value\u std
)。如何在pandas中执行此操作?

尝试重命名您的列:

In [9]: new_df.reset_index(inplace=True)
让我们按以下方式设置列名:如果列存在,则取
level==1
column,否则取
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.010000

尝试重命名您的列:

In [9]: new_df.reset_index(inplace=True)
让我们按以下方式设置列名:如果列存在,则取
level==1
column,否则取
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.010000

我会做一些和MaxU稍有不同的事情。尝试将索引重置为特定列级别,然后删除其他列级别

编辑:

使用可用于设置索引(垂直列)或列标签(案例)的多级排列的
多索引
s,列标签存储为
级别
,其位置存储为
标签
。像这样:

In [4]: df.columns
Out[4]: 
MultiIndex(levels=[[u'value'], [u'mean', u'std']],
           labels=[[0, 0], [0, 1]])
通过执行重置索引(col\u level=1),我们将多索引转换为

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')

我会做一些和MaxU稍有不同的事情。尝试将索引重置为特定列级别,然后删除其他列级别

编辑:

使用可用于设置索引(垂直列)或列标签(案例)的多级排列的
多索引
s,列标签存储为
级别
,其位置存储为
标签
。像这样:

In [4]: df.columns
Out[4]: 
MultiIndex(levels=[[u'value'], [u'mean', u'std']],
           labels=[[0, 0], [0, 1]])
通过执行重置索引(col\u level=1),我们将多索引转换为

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')

你能解释一下你的代码是做什么的,以及它是否会泛化吗?是否有一个内置的pandas也有同样的功能?@mvd,我在我的回答中添加了一条注释-请检查您能否解释一下您的代码的功能,以及它是否会泛化?有没有一个内置的熊猫也这样做?@mvd,我在我的回答中添加了一条评论-请检查你能解释get_level_值在这里的作用吗?你能解释get_level_值在这里的作用吗?