首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以选定值为指标的熊猫枢轴

以选定值为指标的熊猫枢轴
EN

Stack Overflow用户
提问于 2020-08-13 11:06:07
回答 1查看 67关注 0票数 4

我读过this关于旋转的优秀指南,但我想不出如何将它应用到我的案例中。我有这样的数据:

代码语言:javascript
复制
>>> import pandas as pd
>>> df = pd.DataFrame({
...    'case': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', ],
...    'perf_var': ['num', 'time', 'num', 'time', 'num', 'time', 'num', 'time'],
...    'perf_value': [1, 10, 2, 20, 1, 30, 2, 40] 
...     }
...     )
>>>
>>> df
  case perf_var  perf_value
0    a      num           1
1    a     time          10
2    a      num           2
3    a     time          20
4    b      num           1
5    b     time          30
6    b      num           2
7    b     time          40

我想要的是:

  • 使用"case“作为列
  • 使用"num”值作为索引
  • 使用"time“值作为值。

给予:

代码语言:javascript
复制
case a   b
1.0  10  30
2.0  20  40

我所看到的所有枢轴示例都将索引和值放在单独的列中,但在我看来,上面似乎是一个有效/常见的“整洁”数据情况(我认为?)。有可能从这个转向吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-13 11:52:35

您需要进行一些预处理才能获得最终结果:

代码语言:javascript
复制
   (df.assign(num=np.where(df.perf_var == "num",
                           df.perf_value, 
                           np.nan),
             time=np.where(df.perf_var == "time", 
                           df.perf_value, 
                           np.nan))
      .assign(num=lambda x: x.num.ffill(),
              time=lambda x: x.time.bfill())
      .loc[:, ["case", "num", "time"]]
      .drop_duplicates()
      .pivot("num", "case", "time"))


case       a    b
num     
1.0     10.0    30.0
2.0     20.0    40.0

通往同一终点的另一条路线:

代码语言:javascript
复制
(
    df.set_index(["case", "perf_var"], append=True)
    .unstack()
    .droplevel(0, 1)
    .assign(num=lambda x: x.num.ffill(), 
            time=lambda x: x.time.bfill())
    .drop_duplicates()
    .droplevel(0)
    .set_index("num", append=True)
    .unstack(0)
    .rename_axis(index=None)
)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63393806

复制
相关文章

相似问题

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