【问题标题】:Setting a pandas sub dataframe indexed with a MultiIndex设置使用 MultiIndex 索引的 pandas 子数据帧
【发布时间】:2016-06-03 20:48:29
【问题描述】:

我有一个带有 Multi 的 pandas.DataFrame,例如:

In [298]: pd.DataFrame(index=pd.MultiIndex.from_tuples([['a', 1], ['a', 2], ['b', 1], ['b', 3]]), data={'x': 1})
Out[298]: 
     x
a 1  1
  2  1
b 1  1
  3  1

当我想重新分配一个子数据帧时,即 (df.loc['a']),我得到一个奇怪的输出:

In [300]: df.loc['a'] = df.loc['a']

In [301]: df
Out[301]: 
      x
a 1 NaN
  2 NaN
b 1   1
  3   1

这个例子很简单,我显然打算让重新分配更复杂。

正常吗?如何重新分配使用 MultiIndex 索引的子数据帧?

【问题讨论】:

  • 你可以这样做:df.loc[df.index.get_level_values(0) == 'a'] = df

标签: python pandas multi-index


【解决方案1】:

你可以使用[[..]](更新DataFrame而不是Series):

In [11]: df
Out[11]:
     x
a 1  1
  2  1
b 1  1
  3  1

In [12]: df2 = pd.DataFrame(index=pd.MultiIndex.from_tuples([['a', 1], ['a', 2], ['b', 1], ['b', 3]]), data={'x': 2})

In [13]: df.loc[["a"]] = df2.loc[["a"]]

In [14]: df
Out[14]:
     x
a 1  2
  2  2
b 1  1
  3  1

【讨论】:

    【解决方案2】:

    您可以使用pd.IndexSlice 表示pd.MultiIndex 的切片

    df.loc[pd.IndexSlice['a', :], :] = 2
    print df
    
    a 1  2
      2  2
    b 1  1
      3  1
    

    其他例子

    df = pd.DataFrame(index=pd.MultiIndex.from_tuples([['a', 1], ['a', 2], ['b', 1], ['b', 3]]), data={'x': 1})
    
    df.loc[pd.IndexSlice[:, 1], :] = 9
    
    print df
    
         x
    a 1  9
      2  1
    b 1  9
      3  1
    

    或者

    df = pd.DataFrame(index=pd.MultiIndex.from_tuples([['a', 1], ['a', 2], ['b', 1], ['b', 3]]), data={'x': 1})
    
    df.loc[pd.IndexSlice['b', 3], :] = 31415
    
    print df
    
             x
    a 1      1
      2      1
    b 1      1
      3  31415
    

    【讨论】:

      猜你喜欢
      • 2020-05-14
      • 2018-08-14
      • 2021-12-01
      • 2019-04-16
      • 1970-01-01
      • 2020-06-23
      • 2015-09-05
      • 1970-01-01
      • 2017-03-08
      相关资源
      最近更新 更多