【问题标题】:adding a row to a MultiIndex DataFrame/Series向 MultiIndex DataFrame/Series 添加一行
【发布时间】:2014-09-15 01:31:18
【问题描述】:

我想知道是否有一种等效的方法可以使用 MultiIndex 向 Series 或 DataFrame 添加行,就像使用单个索引一样,即使用 .ix 或 .loc?

我认为自然的方式会是这样的

row_to_add = pd.MultiIndex.from_tuples()
df.ix[row_to_add] = my_row

但这会引发 KeyError。我知道我可以使用 .append(),但我会发现使用 .ix[] 或 .loc[] 会更简洁。

这里是一个例子:

>>> df = pd.DataFrame({'Time': [dt.datetime(2013,2,3,9,0,1), dt.datetime(2013,2,3,9,0,1)], 'hsec': [1,25], 'vals': [45,46]})
>>> df
                 Time  hsec  vals
0 2013-02-03 09:00:01     1    45
1 2013-02-03 09:00:01    25    46

[2 rows x 3 columns]
>>> df.set_index(['Time','hsec'],inplace=True)
>>> ind = pd.MultiIndex.from_tuples([(dt.datetime(2013,2,3,9,0,2),0)],names=['Time','hsec'])
>>> df.ix[ind] = 5

Traceback (most recent call last):
  File "<pyshell#201>", line 1, in <module>
    df.ix[ind] = 5
  File "C:\Program Files\Python27\lib\site-packages\pandas\core\indexing.py", line 96, in __setitem__
    indexer = self._convert_to_indexer(key, is_setter=True)
  File "C:\Program Files\Python27\lib\site-packages\pandas\core\indexing.py", line 967, in _convert_to_indexer
    raise KeyError('%s not in index' % objarr[mask])
KeyError: "[(Timestamp('2013-02-03 09:00:02', tz=None), 0L)] not in index"

【问题讨论】:

    标签: python pandas indexing


    【解决方案1】:

    .ix 已弃用后的更新: 请改用[DataFrame.loc][1]

    # say you have dataframe x
    x
    Out[78]: 
                  a    b       time
    indA indB                     
    a    i      0.0  NaN 2018-09-12
    b    j      1.0  2.0 2018-10-12
    c    k      2.0  3.0 2018-11-12
         f      NaN  NaN        NaT
    d    i      5.0  NaN        NaT
    
    x.loc[('a','k'),:] = (3.5,6,pd.NaT)
    
    x
    Out[80]: 
                  a    b       time
    indA indB                     
    a    i      0.0  NaN 2018-09-12
    b    j      1.0  2.0 2018-10-12
    c    k      2.0  3.0 2018-11-12
         f      NaN  NaN        NaT
    d    i      5.0  NaN        NaT
    a    k      3.5  6.0        NaT
    

    【讨论】:

    • x.sort_index() 也可用于在视觉上组合具有相似 MultiIndex 的行
    【解决方案2】:

    您必须指定一个元组才能使多索引起作用(并且您必须完全指定所有轴,例如 : 是必需的)

    In [26]: df.ix[(dt.datetime(2013,2,3,9,0,2),0),:] = 5
    
    In [27]: df
    Out[27]: 
                              vals
    Time                hsec      
    2013-02-03 09:00:01 1       45
                        25      46
    2013-02-03 09:00:02 0        5
    

    虽然更容易重新索引和/或连接/附加新数据帧。一般设置(通过这种放大),只有在使用少量值时才有意义。因为这会在您执行此操作时生成副本。

    【讨论】:

      猜你喜欢
      • 2018-08-20
      • 2019-04-28
      • 2012-11-18
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 2012-11-24
      相关资源
      最近更新 更多