我正在尝试设置多索引熊猫 DataFrame 中一列的所有值,仅指定单个索引级别的数据。到目前为止我提出的解决方案并不令人满意,但这可能最好用代码来解释:
from pandas import MultiIndex, DataFrame
idx = MultiIndex.from_product([['A', 'B'], [1, 2, 3]],
names=['Cases', 'Time'])
parameters = DataFrame(index=idx)
parameters['CaseAndTimeInvariant'] = 1
parameters['CaseAndTimeVariant'] = 1, 2, 3, 4, 5, 6
# Set the values in 'Time' for all cases to 1, 2, 3
parameters['CaseInvariantTimeVariant'] = 1, 2, 3
# ValueError: Length of values does not match length of index
这个错误很明显,因为我没有指定数据应该在哪个级别的任何地方。如果我有另一个“案例”,数据的长度不足以确定我对上面最后一行代码的意思。
我显然需要做的是告诉parameters我传递的数据是针对“时间”索引级别的。但是,我发现的所有使用loc-indexing 的尝试都会导致:
其他全长的 DataFrames 或 Series 或
需要对个别场景进行规范
目前我正在做以下事情:
for c in parameters.index.levels[0]:
parameters.loc[(c, slice(None)), 'CaseInvariantTimeVariant'] = 1, 2, 3
导致:
虽然这符合我的要求,但在两个方面感觉不满意:
它需要两行相当神秘的行来做一些看似简单的事情:(设置Time
使用我给你的这个迭代的所有值!)
我们需要显式迭代所有被处理相同的索引级别,所以这不能很好地推广到两个以上的级别
似乎“groupby”在这里可能会有所帮助,但直到现在我还无法制作大量文档。
白板的微信
相关分类