gpt4 book ai didi

python - 来自另一个数据框的 Pandas 多索引分配

转载 作者:太空狗 更新时间:2023-10-29 17:27:23 27 4
gpt4 key购买 nike

我正在尝试了解 pandas MultiIndex DataFrame 以及如何为它们分配数据。具体来说,我感兴趣的是分配与另一个较小数据框匹配的整个 block 。

ix = pd.MultiIndex.from_product([['A', 'B'], ['a', 'b', 'c', 'd']])
df = pd.DataFrame(index=ix, columns=['1st', '2nd', '3rd'], dtype=np.float64)
df_ = pd.DataFrame(index=['a', 'b', 'c', 'd'], columns=['1st', '2nd', '3rd'], data=np.random.rand(4, 3))
df_

1st 2nd 3rd
a 0.730251 0.468134 0.876926
b 0.104990 0.082461 0.129083
c 0.993608 0.117799 0.341811
d 0.784950 0.840145 0.016777

df 除了所有的值都是 NaN 并且有两个 block AB 之外是相同的.现在,如果我想将 df_ 的值分配给 df 我想我可以做类似的事情

df.loc['A',:] = df_                # Runs, does not work
df.loc[('A','a'):('A','d')] = df_ # AssertionError (??) 'Start slice bound is non-scalar'
df.loc[('A','a'):('A','d')] # No AssertionError (??)

idx = pd.IndexSlice
df.loc[idx['A', :]] = df_ # Runs, does not work

这些都不起作用,它们将 df 中的所有值保留为 NaN,尽管 df.loc[idx['A', :]] 为我提供了与子帧 (df_) 完全匹配的数据帧片段。那么这是在 View 上设置值的情况吗?显式迭代 df_ 中的索引有效

# this is fine
for v in df_.index:
df.loc[idx['A', v]] = df_.loc[v]

# this is also fine
for v in df_.index:
df.loc['A', v] = df_.loc[v]

是否有可能像这样分配整个 block (有点像 NumPy)?如果不是,也没关系,我只是想了解系统的工作原理。

有一个关于索引切片器的相关问题,但它是关于将单个值分配给 DataFrame 的屏蔽部分,而不是关于分配 block 。 Pandas : Proper way to set values based on condition for subset of multiindex dataframe

最佳答案

当你使用

df.loc['A', :] = df_

Pandas 尝试将 df_ 的索引与的子 DataFrame 的索引对齐df。然而,在 point in the code在执行对齐的地方,sub-DataFrame 有一个MultiIndex,而不是你看到的单个索引作为结果df.loc['A', :].

因此对齐失败,因为 df_ 具有单个索引,而不是 MultiIndex是需要的。看df_的索引确实是问题,注意

ix_ = pd.MultiIndex.from_product([['A'], ['a', 'b', 'c', 'd']])
df_.index = ix_
df.loc['A', :] = df_
print(df)

成功,产生类似的东西

A a  0.229970  0.730824  0.784356
b 0.584390 0.628337 0.318222
c 0.257192 0.624273 0.221279
d 0.787023 0.056342 0.240735
B a NaN NaN NaN
b NaN NaN NaN
c NaN NaN NaN
d NaN NaN NaN

当然,您可能不希望每次都创建一个新的 MultiIndex您想要分配一个值 block 的时间。所以相反,要解决这个问题对齐问题,可以使用一个NumPy数组作为赋值:

df.loc['A', :] = df_.values

因为 df_.values 是一个 NumPy 数组并且数组没有索引,no alignment isperformed并且分配产生与上述相同的结果。当你不想索引对齐时使用 NumPy 数组的技巧适用于使用 Pandas 的许多情况。

另请注意,按 NumPy 数组赋值还可以帮助您执行更复杂的赋值,例如对不连续的行进行赋值:

idx = pd.IndexSlice
df.loc[idx[:,('a','b')], :] = df_.values

产量

In [85]: df
Out[85]:
1st 2nd 3rd
A a 0.229970 0.730824 0.784356
b 0.584390 0.628337 0.318222
c NaN NaN NaN
d NaN NaN NaN
B a 0.257192 0.624273 0.221279
b 0.787023 0.056342 0.240735
c NaN NaN NaN
d NaN NaN NaN

例如。

关于python - 来自另一个数据框的 Pandas 多索引分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28431519/

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