【发布时间】:2018-12-29 16:41:42
【问题描述】:
我刚刚开始使用多帧,我在使用相当稀疏的文档和关于切片和索引的在线示例时遇到了一些麻烦。
考虑以下多帧
import pandas as pd
import numpy as np
levels={
'produce_source':['Vendor A', 'Vendor B'],
'day':['mon','wed','fri'],
'chiller_temp':['low','mid'],
'fruit':['apples','pears','nanas']
}
index = pd.MultiIndex.from_product(levels.values(), names = list(levels.keys()))
df = pd.DataFrame(index=index)
df = df.assign(deliveries=np.random.rand(len(df)))
deliveries
produce_source day chiller_temp fruit
Vendor A mon low apples 0.748376
pears 0.639824
nanas 0.604342
mid apples 0.160837
pears 0.970412
nanas 0.301815
wed low apples 0.572627
pears 0.254242
nanas 0.590702
mid apples 0.153772
pears 0.180117
nanas 0.858085
fri low apples 0.535358
pears 0.576359
nanas 0.893993
mid apples 0.334602
pears 0.053892
nanas 0.778767
Vendor B mon low apples 0.565761
pears 0.437994
nanas 0.090994
mid apples 0.261041
pears 0.028795
nanas 0.057612
wed low apples 0.808108
pears 0.914724
nanas 0.020663
mid apples 0.055319
pears 0.888612
nanas 0.623370
fri low apples 0.419422
pears 0.938593
nanas 0.358441
mid apples 0.534191
pears 0.590103
nanas 0.753034
实现以下最pythonic的方法是什么
1) 以切片的形式查看所有的 wed 数据
1a) 延伸目标:不关心 'day' 是 index.names[1],而是按索引名称 'day' 进行索引
2) 仅将可迭代的数据写入该 wed 切片
3) 为所有供应商、日子和水果添加一个 high 的 chiller_temp
我看到使用 idx = pd.IndexSlice 发生了一些切片。
idx = pd.IndexSlice
df_wip = df.loc[idx[:,'wed'], ] #1)
#would love to write to df_wip sliced df here but get slice copy warning with df_wip['deliveries'] = list(range(0,100*len(df_wip),100))
df = df.loc[idx[:,'wed'],'deliveries'] = list(range(0,100*len(df_wip),100)) #2)
这会引发错误 AttributeError: 'list' object has no attribute 'loc'
df = df.loc[idx[:,'wed'],'deliveries'] = pd.Series(range(0,100*len(df_wip),100)) #2)
引发 TypeError: unhashable type: 'slice'
【问题讨论】:
-
我在下面的回答是否符合您的要求?
标签: pandas multi-index