获取由以下人员创建的数据框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
那你怎么处理这个?你能指出我的相关文件吗?
答案 0 :(得分:2)
你做得对。来自indexing docs(强调我的):
.loc
主要是基于标签的,但也可能与布尔数组一起使用。
在.loc
上使用DataFrame
时,语法为
df.loc[row_indexer,column_indexer]
row_indexer
和column_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']
为有效标签选择的原因更为明显。