pandas - Pandas 应用于具有多 iindex 的数据帧的索引
问题描述
我有一个带有索引的数据框
MultiIndex(levels=[['A', 'B', 'C', 'D', 'E', 'F', 'G'], [0, 1]],
labels=[[0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6], [0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1]],
names=['I1', 'I2'])
现在我想对索引 I1 应用一个函数。如果它是一个简单的专栏,我会做类似的事情
df['I1'] = df['I1'].apply(lamdba x :...)
如何将其应用于具有多索引的 df 中的索引?
解决方案
我相信需要rename
:
df = df.rename(lambda x: 'a' + x, level=0)
或Index.get_level_values
选择级别MultiIndex
,map
然后创建MultiIndex.from_arrays
:
idx = df.index.get_level_values('I1').map(lambda x: 'a' + x)
df.index = pd.MultiIndex.from_arrays([idx, df.index.get_level_values('I2')])
因为我得到:
df.index = df.index.set_levels(idx, level='I1')
ValueError:级别值必须是唯一的:['aA','aA','aB','aB','aC','aD','aD','aE','aE','aF',' aF', 'aG', 'aG'] 在 0 级
样品:
mux = pd.MultiIndex(levels=[['A', 'B', 'C', 'D', 'E', 'F', 'G'], [0, 1]],
labels=[[0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6], [0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1]],
names=['I1', 'I2'])
df = pd.DataFrame([0] * 13, index=mux, columns=['a'])
df = df.rename(lambda x: 'a' + x, level=0)
print(df)
a
I1 I2
aA 0 0
1 0
aB 0 0
1 0
aC 1 0
aD 0 0
1 0
aE 0 0
1 0
aF 0 0
1 0
aG 0 0
1 0
推荐阅读
- python - 删除数字并变成列表
- python-3.x - 在 debian:10 上使用 Python3.7 用于 Flask 的 Docker 容器
- c# - 如何编写异步策略处理程序,注入范围服务
- azure - foreach 循环中的 Azure 持久函数调用活动函数。可以吗?
- azure-web-app-service - Azure 应用服务 - Set-AzWebApp:操作返回了无效的状态代码“冲突”
- selenium-webdriver - 应用程序的自动保存功能导致 selenium 脚本失败
- perl - 过滤重复说明
- python-3.x - Pillow : 提取 EXIF 元数据时返回 NoneType
- uima - 德国小说与 DkPro
- javascript - 重复 Promise 直到数组达到一定长度?