gpt4 book ai didi

python - 使用需要在多个级别广播的多索引 Pandas 数据帧执行算术

转载 作者:太空狗 更新时间:2023-10-30 01:28:25 25 4
gpt4 key购买 nike

我有一个如下所示的数据框:

   one                     two                    three                   
1 2 1 2 1 2
X Y X Y X Y X Y X Y X Y
a 0.3 -0.6 -0.3 -0.2 1.5e+00 0.3 -1.0e+00 1.2 0.6 -9.8e-02 -0.4 0.4
b -0.6 -0.4 -1.1 2.3 -7.4e-02 0.7 -7.4e-02 -0.5 -0.3 -6.8e-01 1.1 -0.1

如何将 df 的所有元素除以 df["three"]

我尝试了 df.div(df["three"],level=[1,2]) 但没有成功。

最佳答案

这是一个衬垫。

df / pd.concat( [ df.three ] * 3, axis=1 ).values

这是另一种不太简洁但可能更具可读性的方式。

df2 = df.copy()
for c in df.columns.levels[0]:
df2[c] = df[c] / df['three']

最后,这是一个更长的解决方案,其中包含更多解释。在意识到有更好的方法之前,我最初是这样做的。但我会把它保留在这里,因为它可以提供更多有关此类操作幕后发生情况的信息(尽管可能有点矫枉过正)。

首先,多索引不能很好地复制,所以我将创建一个非常相似的示例数据框。

np.random.seed(123)
tuples = list(zip(*[['one', 'one', 'two', 'two', 'three', 'three'],
['foo', 'bar', 'foo', 'bar', 'foo', 'bar']]))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
df = pd.DataFrame(np.random.randn(3, 6), index=['A', 'B', 'C'], columns=index)

first one two three
second foo bar foo bar foo bar
A -1.085631 0.997345 0.282978 -1.506295 -0.578600 1.651437
B -2.426679 -0.428913 1.265936 -0.866740 -0.678886 -0.094709
C 1.491390 -0.638902 -0.443982 -0.434351 2.205930 2.186786

最简单的方法可能是将分母扩大 3,以便它与完整数据框的维度相匹配。或者,您可以遍历这些列,但之后您必须重新组合它们,这可能不像您在多索引的情况下想象的那么容易。所以像这样广播“三”栏。

denom = pd.concat( [df['three']]*3, axis=1 )
denom = pd.DataFrame( denom.values, columns=df.columns, index=df.index )

first one two three
second foo bar foo bar foo bar
A -0.578600 1.651437 -0.578600 1.651437 -0.578600 1.651437
B -0.678886 -0.094709 -0.678886 -0.094709 -0.678886 -0.094709
C 2.205930 2.186786 2.205930 2.186786 2.205930 2.186786

第一个“denom”行只是将“three”列扩展为与现有数据框相同的形状。第二个“denom”是匹配行和列索引所必需的。现在您可以编写一个普通的除法运算。

df / denom

first one two three
second foo bar foo bar foo bar
A 1.876305 0.603926 -0.489074 -0.912112 1 1
B 3.574501 4.528744 -1.864725 9.151619 1 1
C 0.676082 -0.292165 -0.201267 -0.198625 1 1

与此较长解决方案相关的单行快速说明。一行中的 values 从数据帧转换为数组,这具有删除行和列索引的方便的副作用。或者,在这个更长的解决方案中,我明确地符合索引。根据您的情况,任何一种方法都可能是更好的方法。

关于python - 使用需要在多个级别广播的多索引 Pandas 数据帧执行算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31846585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com