为了账号安全,请及时绑定邮箱和手机立即绑定

如何为 Pandas DataFrame 中的给定索引级别设置值

如何为 Pandas DataFrame 中的给定索引级别设置值

慕容708150 2021-09-01 15:05:24
我正在尝试设置多索引熊猫 DataFrame 中一列的所有值,仅指定单个索引级别的数据。到目前为止我提出的解决方案并不令人满意,但这可能最好用代码来解释:from pandas import MultiIndex, DataFrameidx = MultiIndex.from_product([['A', 'B'], [1, 2, 3]],                              names=['Cases', 'Time'])parameters = DataFrame(index=idx)parameters['CaseAndTimeInvariant'] = 1parameters['CaseAndTimeVariant'] = 1, 2, 3, 4, 5, 6# Set the values in 'Time' for all cases to 1, 2, 3parameters['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”在这里可能会有所帮助,但直到现在我还无法制作大量文档。
查看完整描述

1 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

如果我们总是想将序列与最内层对齐,我们可以:


sequence = [1, 2, 3]

inner_level = parameters.index.get_level_values(len(parameters.index.levels) - 1)

n = inner_level.size // inner_level.nunique()


parameters['CaseInvariantTimeVariant'] = sequence * n

*请注意,sort在分配序列之前,我们仍然需要索引:parameters.sort_index(inplace=True)。


下面如果我们要使用外层:


我会sort_index然后只是重复序列的n时间,其中n是唯一索引的长度(Cases在您的数据中)。


parameters.sort_index(inplace=True)


my_sequence = (1, 2, 3)


# below by level: parameters.index.get_level_values(0).nunique()

n = parameters.index.get_level_values('Cases').nunique()


parameters['CaseInvariantTimeVariant'] = my_sequence * n

如果您想要一个始终按最外层索引重复序列的函数:


def repeat_seq_by_outer_index(index, sequence):

    return sequence * index.get_level_values(0).nunique()


repeat_seq_by_outer_index(parameters.index, (1, 2, 3))

如果您想要一个始终按nth索引中的级别重复序列的函数:


def repeat_seq_by_nth_index(index, level, sequence):

    return sequence * index.get_level_values(level).nunique()


repeat_seq_by_nth_index(parameters.index, 0, (1, 2, 3))


查看完整回答
反对 回复 2021-09-01
  • 1 回答
  • 0 关注
  • 236 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号