【问题标题】:Pandas: Setting slice of multiindexed dataframe with values of a series (aligned)Pandas:使用一系列值设置多索引数据帧的切片(对齐)
【发布时间】:2021-10-29 08:41:54
【问题描述】:

我正在尝试使用与索引值匹配的系列值来设置具有多索引的数据框切片。但是整个切片只是用 NaN 填充。

考虑以下数据框和系列:

import pandas as pd
index = pd.Index(['a', 'b', 'c'])
multi_index = pd.MultiIndex.from_product([index, index])
df = pd.DataFrame({'A': range(9)}, index=multi_index)
df.sort_index(inplace=True)  # just to be sure
ser = pd.Series([11, 22, 33], index)
df, ser

     A
a a  0
  b  1
  c  2
b a  3
  b  4
  c  5
c a  6
  b  7
  c  8

a    11
b    22
c    33
dtype: int64

现在我正在尝试使用系列的内容设置切片,但结果出乎意料:

df.loc[('b',), 'A'] = ser
df

       A
a a  0.0
  b  1.0
  c  2.0
b a  NaN
  b  NaN
  c  NaN
c a  6.0
  b  7.0
  c  8.0

虽然指数一致:

df.loc[('b',), 'A'].index == ser.index

array([ True,  True,  True])

这应该很简单。我做错了什么?

【问题讨论】:

  • 您的索引仅在级别 1 对齐,而不是整体多索引:ser = pd.Series([11, 22, 33], pd.MultiIndex.from_tuples([('b', 'a'), ('b', 'b'), ('b', 'c')])) 将正确对齐。或者你可以使用 BENY 的建议来打破与values的对齐
  • 感谢您的评论。我已经怀疑是这样的问题。现在我可以在这个和 BENY 的建议之间做出选择。无论如何,我必须确保对齐。

标签: python pandas slice series multi-index


【解决方案1】:

您可能需要在末尾添加values,以消除index匹配对pandas assign的影响

df.loc[('b',), 'A'] = ser.values
df
Out[29]: 
      A
a a   0
  b   1
  c   2
b a  11
  b  22
  c  33
c a   6
  b   7
  c   8

【讨论】:

  • 感谢您的回答。我也在考虑这一点,但我必须仔细检查在我的情况下值是否正确对齐,然后它应该可以工作。
猜你喜欢
  • 2020-01-24
  • 2017-08-11
  • 2019-07-22
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 2022-11-03
  • 2014-05-02
相关资源
最近更新 更多