首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将熊猫数据聚合成平面数据(没有层次索引)?

如何将熊猫数据聚合成平面数据(没有层次索引)?
EN

Stack Overflow用户
提问于 2016-03-31 17:30:28
回答 2查看 2.5K关注 0票数 0

我有两个时间值的测量数据,并具有副本:

代码语言:javascript
复制
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”列)副本的均值和标准差。这可以通过以下方式来完成:

代码语言:javascript
复制
df = pandas.read_table("data.txt",sep="\t")
g = df.groupby(["name", "t"])
new_df = g.agg([np.mean, np.std])

问题是new_df有一个分层索引:

代码语言:javascript
复制
           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(),但这并不能做到:

代码语言:javascript
复制
>>> 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)。怎样才能在熊猫身上做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-31 19:07:53

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

代码语言:javascript
复制
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。如下所示:

代码语言:javascript
复制
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转换为

代码语言:javascript
复制
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。

代码语言:javascript
复制
 Out[6]: Index([u'name', u't', u'mean', u'std'], dtype='object')
票数 3
EN

Stack Overflow用户

发布于 2016-03-31 18:14:51

尝试重命名您的列:

代码语言:javascript
复制
In [9]: new_df.reset_index(inplace=True)

让我们以如下方式设置列名:如果存在level==1列,则选择它,否则使用带有level==0的列

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36339960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档