Python Pandas -重复dict以适应MultiIndex数据框架

mfuanj7w  于 2023-11-15  发布在  Python
关注(0)|答案(2)|浏览(124)

我有一个我想使用的MultiIndex数据框架的结构(灵感来自文档)。我想用一个命令在每一层示例化它。
MultiIndex Dataframe一般结构:

import pandas as pd

def mklbl(prefix, n):
    return ["%s%s" % (prefix, i) for i in range(n)]

miindex = pd.MultiIndex.from_product(
    [mklbl("X", 2), mklbl("Y", 2), mklbl("Z", 2)]
)

columns = ['A', 'B', 'C']

dfmi = (
    pd.DataFrame(
        # Code below from the documentation. To replace??
        # np.arange(len(miindex) * len(columns)).reshape(
        #   (len(miindex), len(columns))
        ),
        index=miindex,
        columns=columns,
    )
    .sort_index()
    .sort_index(axis=1)
)

字符串
我想以某种方式取代上面的注解代码由以下字典的几个重复,这适合与MultiIndex,

my_dict = {'A': [False, False, True, True], 
           'B': [False, True, False, True], 
           'C': [0, 0, 0, 0]}


这样我就得到了一个最终结果:

A       B   C
X0 Y0 Z0   False   False   0
           False   True    0
           True    False   0
           True    True    0
      Z1   False   False   0
           False   True    0
           True    False   0
           True    True    0
   Y1 Z0   False   False   0
           False   True    0
           True    False   0
           True    True    0
      Z1   False   False   0
           False   True    0
           True    False   0
           True    True    0
X1 Y0 Z0   False   False   0
           False   True    0
           True    False   0
           True    True    0
      Z1   False   False   0
           False   True    0
           True    False   0
           True    True    0
   Y1 Z0   False   False   0
           False   True    0
           True    False   0
           True    True    0
      Z1   False   False   0
           False   True    0
           True    False   0
           True    True    0


我试着用pd.concat()玩了一下,但没有成功。这可能吗?

a5g8bdjr

a5g8bdjr1#

您可以将合并concatitertools.product组合在一起:

from itertools import product

prod = product(mklbl("X", 2), mklbl("Y", 2), mklbl("Z", 2))

tmp = pd.DataFrame(my_dict)

out = pd.concat({p: tmp for p in prod})

字符串
或者,如果你已经有了dfmi,使用cross-merge

out = (dfmi[[]]
 .reset_index()
 .merge(pd.DataFrame(my_dict), how='cross')
)

out = (out
 .set_index(list(out)[:dfmi.index.nlevels])
 .rename_axis(index=[None]*dfmi.index.nlevels)
)


输出量:

A      B  C
X0 Y0 Z0 0  False  False  0
         1  False   True  0
         2   True  False  0
         3   True   True  0
      Z1 0  False  False  0
         1  False   True  0
         2   True  False  0
         3   True   True  0
   Y1 Z0 0  False  False  0
         1  False   True  0
         2   True  False  0
         3   True   True  0
      Z1 0  False  False  0
         1  False   True  0
         2   True  False  0
         3   True   True  0
X1 Y0 Z0 0  False  False  0
         1  False   True  0
         2   True  False  0
         3   True   True  0
      Z1 0  False  False  0
         1  False   True  0
         2   True  False  0
         3   True   True  0
   Y1 Z0 0  False  False  0
         1  False   True  0
         2   True  False  0
         3   True   True  0
      Z1 0  False  False  0
         1  False   True  0
         2   True  False  0
         3   True   True  0

qzwqbdag

qzwqbdag2#

为了用dict填充你的嵌套框,你应该根据嵌套框列的长度再增加一个级别:

miindex = pd.MultiIndex.from_product(
    [mklbl("X", 2), mklbl("Y", 2), mklbl("Z", 2), mklbl("", 4)]
)

字符串
然后你可以通过像这样循环索引来添加你的dict:

data_df = pd.DataFrame(index=miindex, columns=columns)
for index_x, data_x in data_df.groupby(level=0, ):
    for index_y, data_y in data_x.loc[index_x].groupby(level=0):
        for index_z, data_z in data_y.loc[index_y].groupby(level=0):
            for col_name, col_values in imy_dict.items():
                data_df.loc[(index_x, index_y, index_z), col_name] = col_values


结果如下:

print(data_df)

                A      B  C
X0 Y0 Z0 0  False  False  0
         1  False   True  0
         2   True  False  0
         3   True   True  0
      Z1 0  False  False  0
         1  False   True  0
         2   True  False  0
         3   True   True  0
   Y1 Z0 0  False  False  0
         1  False   True  0
         2   True  False  0
         3   True   True  0
      Z1 0  False  False  0
         1  False   True  0
         2   True  False  0
         3   True   True  0
X1 Y0 Z0 0  False  False  0
         1  False   True  0
         2   True  False  0
         3   True   True  0
      Z1 0  False  False  0
         1  False   True  0
         2   True  False  0
         3   True   True  0
   Y1 Z0 0  False  False  0
         1  False   True  0
         2   True  False  0
         3   True   True  0
      Z1 0  False  False  0
         1  False   True  0
         2   True  False  0
         3   True   True  0

相关问题