2016-02-27 77 views
2

以数据帧,di,所创造的一个子集:正确的方式将数据分配到multiindexed大熊猫数据帧

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 

那么,你会如何处理呢?你能指点我的相关文件吗?

回答

2

你说得对。从indexing docs(重点煤矿):

.loc主要是基于,但也可以用布尔阵列使用的标记。

当在DataFrame使用.loc,语法是

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']是一个有效的标签选择。