向MultiIndex DataFrame/Series添加一行

28

我想知道是否有一种等效的方法可以向具有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"
2个回答

25

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

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
更容易重新索引和/或串联/附加新的数据框。通常,只有在使用少量值进行此操作时,设置(使用这种扩展)才有意义。因为当您执行此操作时会复制它。

24

自从.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的行可视化组合。 - Russell Burdt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接