pandas:按二级索引范围将值分配给多索引切片

标签 pandas

我在将一系列类似对象分配给 Pandas 数据帧的切片时遇到问题。 也许我没有按照预期的方式使用 Datafarme,所以一些启示将不胜感激。 我已经阅读了以下文章:

pandas: slice a MultiIndex by range of secondary index

Returning a view versus a copy

据我了解,我通过一次 .loc 调用调用切片的方式确实确保我没有得到数据的副本。显然,原始数据帧也被更改,但我得到的不是预期的数据,而是 NaN 值。 请参阅附加的代码片段。

我是否必须针对要更改的每个单个值迭代数据帧的所需部分并使用 .set_value(row_idx,col_idx,val) 方法?

提前致以亲切的问候和感谢

马库斯

In [1]: import pandas as pd

In [2]: mindex = pd.MultiIndex.from_product([['one','two'],['first','second']])

In [3]: dfmi = pd.DataFrame([list('abcd'),list('efgh'),list('ijkl'),list('mnop')],
   ...:                     index = mindex, columns=(['X','Y','Z','Q']))

In [4]: print(dfmi)
            X  Y  Z  Q
one first   a  b  c  d
    second  e  f  g  h
two first   i  j  k  l
    second  m  n  o  p

In [5]: dfmi.loc[('two',slice('first','second')),'X']
Out[5]: 
two  first     i
     second    m
Name: X, dtype: object

In [6]: substitute = pd.Series(data=["ab","cd"], index= mindex.levels[1])
   ...: print(substitute)
first     ab
second    cd
dtype: object

In [7]: dfmi.loc[('two',slice('first','second')),'X'] = substitute

In [8]: print(dfmi)
              X  Y  Z  Q
one first     a  b  c  d
    second    e  f  g  h
two first   NaN  j  k  l
    second  NaN  n  o  p

最佳答案

发生的事情是 substitute 有一个索引,它确定值的位置,并且 dfmi.loc[('two',slice('first','second') ),'X'] 也指定了这样的位置。

在分配期间,pandas 尝试对齐两个索引,并且由于它们不匹配(如果 substitute 也是多索引,则它们会匹配),因此对齐的结果都是 NA,这得到插入。

解决方案可能是删除 substitute 的索引,因为您想要插入值的位置已在 loc 中指定:

dfmi.loc[('two',slice('first','second')),'X'] = substitute.values

或者更简单,直接插入值:

dfmi.loc[('two',slice('first','second')),'X'] = ["ab","cd"]

关于pandas:按二级索引范围将值分配给多索引切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39508306/

相关文章:

python - 如何按 block 将函数应用于 Pandas 数据框?

python - Plotly:如何从数据框中绘制桑基图?

python - Matplotlib、绘图和条形图不与同一索引对齐

python - Pandas 根据一组删除重复项并保留最后一个值

python - pandas - 将多个重复项从 df 提取到另一个

python - 错误 'AttributeError: ' DataFrameGroupBy'对象没有属性'而数据帧上的 groupby 功能

python - 在给定阈值内合并范围(间隔)的有效方法

python - 如何仅聚合混合 dtypes 数据框中的数字列

python - 将 pandas DataFrame 与 MultiIndex 合并

python - 按索引(列)号选择 Pandas 数据框中的列