python - 使用选定值作为索引的 Pandas 数据透视表

标签 python pandas

我读了 this出色的旋转指南,但我不知道如何将其应用于我的案例。我有这样的整洁数据:

>>> 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”值作为索引
  • 使用“时间”值作为值。

  • 给予:
    case a   b
    1.0  10  30
    2.0  20  40
    
    我能看到的所有数据透视示例都在单独的列中包含索引和值,但对我来说,上面的示例似乎是一个有效/常见的“整洁”数据案例(我认为?)。是否有可能从这里转向?

    最佳答案

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

       (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
    
    到同一终点的替代路线:
    (
        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)
    )
    

    关于python - 使用选定值作为索引的 Pandas 数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63393806/

    相关文章:

    python - 读取具有超过 1 个条目的列的数据

    python - 比较两列,如果满足条件,则将 '1' 添加到新列

    python - 如何测量python函数的速度

    python - 视频在 opencv 上停止

    python - 从python执行awk命令

    python - 如何获得居中滚动的意思?

    python - 如何通过广播将numpy数组与 Pandas 数据帧相乘

    python - 在子进程已经启动后授予对共享内存的访问权限

    python - 如何使用 Python 替换 XML 中的节点值

    python - 计算数据帧中记录之间的增量时间