将级别附加到 pandas MultiIndex
Posted
技术标签:
【中文标题】将级别附加到 pandas MultiIndex【英文标题】:Append a level to a pandas MultiIndex 【发布时间】:2018-11-09 13:46:40 【问题描述】:假设我有一个带有三个索引“a”、“b”和“c”的 pandas 数据框 - 如何从数组中添加第四个索引并将其名称同时设置为“d”?
这行得通:
df.set_index(fourth_index, append=True, inplace=True)
df.index.set_names(['a','b','c','d'], inplace=True)
但我正在寻找不需要我再次命名前三个索引的东西,例如(这不起作用):
df.set_index('d': fourth_index, append=True, inplace=True)
我在这里缺少一些功能吗?
【问题讨论】:
【参考方案1】:将fourth_index
添加为列,然后调用set_index
。名称被保留。
df = df.assign(d=fourth_index).set_index('d', append=True)
请注意,如果您担心内存问题,那么您所做的一切都很好。为了更少的字符而牺牲性能是没有意义的。
演示
df
a b c d
l1 l2
bar one 24 13 8 9
two 11 30 7 23
baz one 21 31 12 30
two 2 5 19 24
foo one 15 18 3 16
two 2 24 28 11
qux one 23 9 6 12
two 29 28 11 21
df.assign(l3=1).set_index('l3', append=True)
a b c d
l1 l2 l3
bar one 1 24 13 8 9
two 1 11 30 7 23
baz one 1 21 31 12 30
two 1 2 5 19 24
foo one 1 15 18 3 16
two 1 2 24 28 11
qux one 1 23 9 6 12
two 1 29 28 11 21
【讨论】:
谢谢!不担心性能 - 更担心我需要在多个位置控制其他三列的名称这一事实,我想保持它们原样而不是重新定义它们以与以前相同:-)【参考方案2】:为什么不直接保存之前值的名称,即
old_names = df.index.names
df.set_index(fourth_index, append=True, inplace=True)
df.index.set_names(old_names + ['d'], inplace=True)
这样可以保持良好性能的好处,并且不需要您重新输入旧名称。
【讨论】:
【参考方案3】:set_names 支持特定于关卡的(重新)命名
df.set_index(fourth_index, append=True, inplace=True)
df.index.set_names('d', level=df.index.nlevels-1, inplace=True)
也可以在一行中不用inplace:
df.index = df.set_index(fourth_index, append=True).index.set_names('d', level=df.index.nlevels)
【讨论】:
以上是关于将级别附加到 pandas MultiIndex的主要内容,如果未能解决你的问题,请参考以下文章
将字符串拆分附加到 Pandas DataFrame [关闭]
尝试使用 pandas 数据框将数据附加到 BigQuery 表时出错