Python 熊猫-广播部

Python 熊猫-广播部,python,pandas,Python,Pandas,我有两个数据帧: df_1带有单个索引i和floats的一列LB df_2具有多索引i、a、s和500列浮动s 我的目标是将df_1[LB]中的每个值除以df_2中具有相应索引i的每个单元格,以便以df_2的相同维度输出df_3 我以前的迭代方法适用于具有两级多索引的df_2,但在添加第三级时失败了 df_3=pd.DataFrame(index=df_2.index,columns=df_2.columns) 对于i中的i: df_3.loc[_i]=df_1.loc[_i][LB]/df

我有两个数据帧:

  • df_1
    带有单个索引
    i
    float
    s的一列
    LB
  • df_2
    具有多索引
    i、a、s
    和500列
    浮动
    s
我的目标是将
df_1[LB]
中的每个值除以
df_2
中具有相应索引
i
的每个单元格,以便以
df_2
的相同维度输出
df_3

我以前的迭代方法适用于具有两级多索引的
df_2
,但在添加第三级时失败了

df_3=pd.DataFrame(index=df_2.index,columns=df_2.columns)
对于i中的i:
df_3.loc[_i]=df_1.loc[_i][LB]/df_2.loc[_i]#TypeError:在未指定联接级别的情况下,无法在多索引上对齐
我想知道是否有一种通用的广播方式

编辑:我找到了一种方法,将
df_1
的值复制到
df_3
中,然后将
df_3
除以
df_2

df_3=pd.DataFrame(index=df_2.index,columns=df_2.columns)
对于i中的i:
df_3.loc[_i]=df_1.loc[_i][LB]
df_3=df_3/df_2
但是,如果
df_1
也有多索引(df_2的子集),那么在不循环的情况下将
df_1
的值传播到
df_3
的最佳方式是什么?

您可以广播
df_1
,以匹配第二个数据帧的多级索引。然后,您可以轻松地在numpy级别广播分区:

tmp = pd.DataFrame(np.repeat(df_1.values, len(df_2)/len(df_1)),
                   index = df_2.index, columns=df_1.columns)

df_3 = pd.DataFrame(df_2.values / tmp.values, index=df_2.index,
                   columns=df_2.columns)
唯一的要求是:

  • df_1
    必须有一列
  • df_2
    必须具有与
    df1
    相同的索引,或者具有第一级为
    df1的多索引。索引

事实上,只要重塑
df_2.values
并让numpy广播操作就足够了:

df_3 = pd.DataFrame(data=(
    df_2.values.reshape(len(df_1),(len(df_2) // len(df_1)) * len(df_2.columns))
    / df_1.values).reshape(len(df_2), len(df_2.columns)),
                    index=df_2.index, columns=df_2.columns)

您的df_2看起来如何?3级多索引
i、a、s
和500列。每个索引级别都是单个值的数组。我喜欢重塑的优雅。但是,元素的顺序存在问题。为了正确匹配初始索引,应该在除法之前对索引进行排序。@phet事实上,我假设第一级是相同的,包括顺序……我还认为两边的顺序都是相同的。但结果似乎很奇怪。在应用您的解决方案之前,我必须对索引进行排序。