【问题标题】:Unable to assign values to new MultiIndex slices (setting with enlargement)无法为新的 MultiIndex 切片分配值(放大设置)
【发布时间】:2018-01-24 19:53:32
【问题描述】:

鉴于我的数据框(如下),我可以单独创建新的 MultiIndex 行,这些行不存在

data.loc[('A', 6, 'test'), 'Data'] = 'a_value'

同样,我可以修改MultiIndex中已经存在的slices

 data.loc[pd.IndexSlice['A', 7:8, ('spam', 'eggs')], 'Data'] = 'a_value'

我无法做到以下几点

data.loc[pd.IndexSlice['A', (6, 7), ('eggs', 'spam')], 'Data'] = 'a_value'

因为切片返回的DataFrame 是空的。除了单独遍历所有不存在的索引之外,还有什么方法可以做到这一点?

示例数据

复制下面的代码即可生成测试DataFrame

import pandas as pd
import numpy as np
data = pd.DataFrame(np.asarray([np.nan]*2+[np.random.random() for i in range(4)]+[np.nan]*2+[np.random.random(), np.random.random()]),index=pd.MultiIndex(levels=[[u'A', u'B'], [6, 7, 8, 9], [u'eggs', u'spam']], labels=[[0, 0, 0, 0, 0, 0, 1, 1, 1, 1], [0, 1, 2, 2, 3, 3, 0, 1, 2, 3], [-1, -1, 0, 1, 0, 1, -1, -1, 1, 1]], names=[u'ID', u'ID2', u'ID3']),columns=['Data'])
# end snippet for easy copy/paste to ipython

类似

Assign new values to slice from MultiIndex DataFrame

  • 请注意,这与本文涵盖已经在MultiIndex 中的MultiIndex 切片的情况不同。

【问题讨论】:

  • 嗯。这称为“放大设置”,但我不确定它是否适用于一般切片,即使没有多索引。该文档仅声明它适用于单个键。
  • 欢迎任何好的解决方法作为答案!
  • 好吧,我只是戳这里……我不太了解它是否可以说这是一个错误,我只知道它叫什么,呵呵。跨度>
  • @JohnE 我在英国所以我睡着了!您的答案是目前最好的解决方案-您应该离开它。我真的很喜欢将data.index.levelsMultiIndex.from_product 一起使用
  • 抱歉,我取消了删除

标签: python pandas indexing multi-index


【解决方案1】:

我只是用 NaN 填充,但如果你愿意,当然你可以使用 fillna。现有的数据框已经有一些缺失的值,所以只给新行一个非 NaN 值会有点困难,但可以使用update,但我不是 100% 清楚你到底想在这里做什么.

data.reindex( pd.MultiIndex.from_product( data.index.levels ) )

              Data
A 6 eggs       NaN
    spam       NaN
  7 eggs       NaN
    spam       NaN
  8 eggs  0.938516
    spam  0.487062
  9 eggs  0.958066
    spam  0.786476
B 6 eggs       NaN
    spam       NaN
  7 eggs       NaN
    spam       NaN
  8 eggs       NaN
    spam  0.674202
  9 eggs       NaN
    spam  0.576285

【讨论】:

  • 主要问题是我不一定知道他缺少索引是 6,7。我当前的后备与上述非常相似。遍历 ID,然后使用 get_index_values("ID3").unique() 而不是硬编码 6,7。你们补充说,我会为最佳方法投赞成票。如果熊猫更新有更快的方法,希望保持开放
  • @AlexanderMcFarlane 不确定我是否理解,但请查看我的更新 altho,它没有填充值。我不知道为什么分两步做会有很大的问题?
猜你喜欢
  • 2013-05-25
  • 2018-01-06
  • 2017-05-08
  • 2016-04-18
  • 2017-03-28
  • 2016-10-15
  • 1970-01-01
  • 2017-06-29
  • 2018-12-29
相关资源
最近更新 更多