将数据分配给多索引pandas数据帧的子集的正确方法

时间:2016-02-27 02:40:28

标签: python pandas

获取由以下人员创建的数据框di

import pandas as pd

data = {
    "Event": ['Biathlon', 'Ski Jump', 'Slalom', 'Downhill'],
    "Award": ['Gold', 'Bronze', 'Gold', 'Silver'],
    "Points":  ['100', '10', '100', '40'],
    "Rank":   ['1', '3', '1', '2']
}

d = pd.DataFrame(data)
di = d.set_index(["Award","Event"])
print(di)

更改('Bronze', 'Ski Jump')记录的分值的正确方法是什么?

通过反复试验,我知道以下内容似乎有效,但我pandas documentation并不清楚这是一种公认​​的做法。

di.loc[('Bronze', 'Ski Jump'), 'Points'] = 20

那你怎么处理这个?你能指出我的相关文件吗?

1 个答案:

答案 0 :(得分:2)

你做得对。来自indexing docs(强调我的):

  

.loc主要是基于标签的,但也可能与布尔数组一起使用。

.loc上使用DataFrame时,语法为

  

df.loc[row_indexer,column_indexer]

row_indexercolumn_indexer中的每一个都可以

  
      
  • 单个标签 [...]
  •   
  • 标签列表或数组['a', 'b', 'c']
  •   
  • 标签为'a':'f' [...]
  • 的切片对象   
  • 布尔数组
  •   

您正在使用第一个项目符号点。您的行索引是一个多索引,标签是元组。您的列索引是纯字符串索引。然后,表达式

di.loc[('Bronze', 'Ski Jump'), 'Points']

转换为"沿着行多索引获取位于('Bronze', 'Ski Jump')的值,沿着列索引获取位于'Points'的值。"这正是你想要的。

考虑这个例子的另一种方法是忘记多索引。来自MultiIndex / Advanced Indexing

  

值得记住的是,没有什么能阻止你将元组用作轴上的原子标签

多索引与普通元组索引非常相似,尽管它提供了扩展功能(例如,您可以仅使用像di.loc['Bronze']这样的第一级索引)。不过,您实际上可以创建数据框,如

df = pd.DataFrame([
    ['100', '1'],
    ['10', '3'],
    ['100', '1'],
    ['40', '2']
], columns=['Points', 'Rank'], index=[
    ('Gold', 'Biathlon'),
    ('Bronze', 'Ski Jump'),
    ('Gold', 'Slalom'),
    ('Silver', 'Downhill')
])

这使di.loc[('Bronze', 'Ski Jump'), 'Points']为有效标签选择的原因更为明显。