Pandas根据字典替换行的索引

时间:2018-02-15 01:02:29

标签: python pandas dictionary dataframe

我有一个名为df的pandas数据框:

             1   2   3   4   5   6   7   8   9   10
dog   jumps   1   1   1   1   1   1   0   1   1   1
      fox     1   1   1   1   1   1   0   0   1   1
      the     1   1   1   1   1   1   1   0   1   1
      dog     1   1   1   1   1   1   0   0   1   1
      over    1   1   1   1   1   1   0   0   1   1
fox   jumps   1   1   1   1   1   1   0   1   1   1
      fox     1   1   1   1   1   1   0   0   1   1
      the     1   1   1   1   1   1   1   0   1   1
      dog     1   1   1   1   1   1   0   0   1   1
      over    1   1   1   1   1   1   0   0   1   1
jumps jumps   1   1   1   1   1   1   0   0   1   0
      fox     1   1   1   1   1   1   1   0   1   0
      the     1   0   1   1   1   1   0   0   1   0
      dog     1   1   1   1   1   1   1   0   1   0
      over    1   0   1   1   1   0   0   1   1   0
over  jumps   1   1   0   1   0   1   1   0   1   0
      fox     1   1   1   1   1   1   0   0   1   0
      the     1   0   1   1   1   0   0   1   1   0
      dog     1   1   1   1   1   1   0   0   1   0
      over    1   1   1   1   1   1   0   0   1   0
the   jumps   1   1   0   1   1   1   0   0   1   0
      fox     1   1   1   1   1   1   0   1   1   0
      the     1   1   1   1   1   1   0   0   1   0
      dog     1   1   1   1   1   1   0   1   1   0
      over    1   1   0   1   0   1   1   0   1   0

我有以下字典:

dic = {'dog': 1, 'fox': 1, 'the': 2, 'over': 2, 'jumps': 0}

我想用dic中的各自值替换索引的值。

我尝试了以下方法:

df.index.levels[0][0] = 'integer value'

但这不起作用,它给了我错误:

  

TypeError:索引不支持可变操作

此外pandas rename function也无效

知道如何以最有效和最干净的方式做到这一点。任何建议都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

我认为rename仍在工作

df.rename(index=dic)
Out[1311]: 
     1  2  3  4  5  6  7  8  9  10                               
1 0  1  1  1  1  1  1  0  1  1   1
  1  1  1  1  1  1  1  0  0  1   1
  2  1  1  1  1  1  1  1  0  1   1
  1  1  1  1  1  1  1  0  0  1   1
  2  1  1  1  1  1  1  0  0  1   1
  0  1  1  1  1  1  1  0  1  1   1
  1  1  1  1  1  1  1  0  0  1   1
  2  1  1  1  1  1  1  1  0  1   1
  1  1  1  1  1  1  1  0  0  1   1
  2  1  1  1  1  1  1  0  0  1   1

答案 1 :(得分:1)

这应该有效:

s = df.index.to_series()
df.index = s.map(dic).fillna(s)

由于某些原因,系列允许通过字典进行映射,但只允许索引函数。

工作示例:

df = pd.DataFrame([['a', 'b', 1], ['a', 'c', 2],
                   ['b', 'd', 3], ['b', 'c', 4]],
                  columns=['A', 'B', 'C'])

df = df.set_index('A')

print(df.index)
# Index(['a', 'a', 'b', 'b'], dtype='object', name='A')

s = df.index.to_series()
df.index = s.map({'a': 'X'}).fillna(s)

print(df.index)
# Index(['X', 'X', 'b', 'b'], dtype='object', name='A')