pandas 通过在顶级下聚集同名列来创建多级 Dataframe

f87krz0w  于 2023-01-24  发布在  其他
关注(0)|答案(1)|浏览(93)

考虑以下输入 Dataframe :

index      |        col_1            |           col_2             |
         1         |        1234             |           4567              |
         2         |        3456             |           9453              |

Dataframe 的每一列都是一个序列(时间序列),我们希望进行一些计算,以创建长度等于输入的序列(例如,计算最后5个样本(op_1)和10个样本(op_2)的序列的运行平均值)。
最后,输出应按列的名称分组,如下所示:

Output:

                   |        col_1          |          col_2        |
        index      | value   opr_1   opr_2 | value   opr_1   opr_2 |
         1         | 1234     10       1   | 4567     22       13  |
         2         | 3456     18       6   | 9453     21       4   |

这应该允许我访问单个head col_1下每个原始列的相关计算。
最初,我考虑手动增加输入 Dataframe 的级别,如下所示:

df.columns = pd.MultiIndex.from_product([df.columns, ['value']])

但是,我不知道如何单独在第二层运行apply(考虑到我希望将列寻址为df['col_1']['value'],然后将这些值放入df['col_1']['op_1']内同一层的 Dataframe 中)。
因此,我尝试的第二种方法是为每个操作创建一个 Dataframe ,如下所示

op_1 = df.apply(lambda x: op_1_func(x, **params))
op_2 = df.apply(lambda x: op_2_func(x, **params))

然后合并这三个 Dataframe 以创建所需的多级视图。但是,我想不出一种方法来连接 Dataframe 以产生所需的输出。请帮助!

m2xkgtsf

m2xkgtsf1#

给出以下示例:

import numpy as np
import pandas as pd

def opr1_func(x, y):
    return sum(x) - y

def opr2_func(x, y):
    return np.mean(x) - y

df = pd.DataFrame({"col1": [2, 4, 6, 8, 10], "col2": [6, 8, 12, 14, 16]})

这里是一种方法来做到这一点使用Pandas先进的索引与分层索引:

df.columns = pd.MultiIndex.from_product([df.columns, ["value"]])

for col in ["col1", "col2"]:
    for new_col, func in zip(["opr_1", "opr_2"], [opr1_func, opr2_func]):
        df[(col, new_col)] = df[(col, "value")].rolling(2).apply(lambda x: func(x, 10))

df = df.reindex(
    pd.MultiIndex.from_product([["col1", "col2"], ["value", "opr_1", "opr_2"]]), axis=1
)

然后:

print(df)
# Output

   col1              col2
  value opr_1 opr_2 value opr_1 opr_2
0     2   NaN   NaN     6   NaN   NaN
1     4  -4.0  -7.0     8   4.0  -3.0
2     6   0.0  -5.0    12  10.0   0.0
3     8   4.0  -3.0    14  16.0   3.0
4    10   8.0  -1.0    16  20.0   5.0

相关问题