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
s的一列float
LB
具有多索引df_2
和500列i、a、s
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事实上,我假设第一级是相同的,包括顺序……我还认为两边的顺序都是相同的。但结果似乎很奇怪。在应用您的解决方案之前,我必须对索引进行排序。