如何基于MultiIndex条件创建新列(无Python循环实现)
解决方案:无循环实现三级索引DataFrame的条件列创建
嘿,我来帮你搞定这个需求!要给这个三级索引的DataFrame加NEW列,还不能用循环,咱们用矢量化操作就能高效解决,完全符合要求。
首先,先把完整的代码放出来,你可以直接运行:
import numpy as np import pandas as pd # 重建你提供的DataFrame arrays = [np.array(['bar', 'bar', 'bar', 'bar', 'bar', 'bar', 'baz', 'baz', 'baz', 'baz', 'baz', 'baz', 'foo', 'foo', 'foo', 'foo', 'foo', 'foo']), np.array(['one','two'] * 9), np.array([1,2,3] * 6)] df = pd.DataFrame(np.random.randn(18,2), index=arrays, columns=['col0', 'col1']) # 提取需要用到的索引层级 level_0 = df.index.get_level_values(0) level_2 = df.index.get_level_values(2) # 定义所有条件分支 conditions = [ # bar组:第三层索引>1时取col1,否则取col0(这里假设你需求里的col2是笔误,原DF没有这列) (level_0 == 'bar') & (level_2 > 1), (level_0 == 'bar') & (level_2 <= 1), # baz组:第三层索引>2时取col1,否则取col0 (level_0 == 'baz') & (level_2 > 2), (level_0 == 'baz') & (level_2 <= 2), # foo组:第三层索引>3时取col1,否则取col0(原DF里level2最大是3,所以这组实际全取col0) (level_0 == 'foo') & (level_2 > 3), (level_0 == 'foo') & (level_2 <= 3) ] # 对应每个条件的取值 values = [ df['col1'], df['col0'], df['col1'], df['col0'], df['col1'], df['col0'] ] # 创建NEW列 df['NEW'] = np.select(conditions, values) # 打印结果看看 print(df)
代码细节说明:
- 用
get_level_values直接提取索引层级,比手动遍历高效得多,是Pandas处理多层索引的标准做法; np.select是专门处理多条件分支的矢量化工具,把所有条件和对应取值列出来就行,完全不需要写Python循环,性能远高于逐行判断;- 我注意到你需求里提到的
col2应该是笔误——你的DataFrame只有col0和col1两列,所以默认用col0替代了,如果实际有其他目标列,直接修改values里对应的部分即可; - 另外,
foo组的level2>3条件在当前数据里永远不会触发,因为第三层索引最大就是3,不过代码已经写好,后续如果有更大的索引值,会自动生效。
这样处理下来,代码简洁高效,完全满足你的要求~
内容的提问来源于stack exchange,提问作者Ranny
相关产品推荐
相关产品推荐

