python - 在 MultiIndex 中选择水平对的子集元组
问题描述
(抱歉,如果这是转发。我能找到的最接近的答案是:multiindex selection in pandas并不能完全满足我的要求。相反,我将使用该问题中的数据作为示例,因为我自己的数据有类似的设置,但需要更多解释)
这是数据(重新发布):
0 1 2 3
first second third
C one mean 3 4 2 7
std 4 1 7 7
two mean 3 1 4 7
std 5 6 7 0
three mean 7 0 2 5
std 7 3 7 1
H one mean 2 4 3 3
std 5 5 3 5
two mean 5 7 0 6
std 0 1 0 2
three mean 5 2 5 1
std 9 0 4 6
V one mean 3 7 3 9
std 8 7 9 3
two mean 1 9 9 0
std 1 1 5 1
three mean 3 1 0 6
std 6 2 7 4
根据先前的查询,我有一组基于第 0 列中小于等于 3 的值的第一和第二索引级别的元组。例如:
# 选择第 0 列的“平均”值 <= 3 的行。 ser = df.loc[(slice(None), slice(None), 'mean'), 0] ser = ser[ser <= 3] idx_tuples = [(val[0], val[1]) for val in ser.index] # 有值:[(C, 一), (C, 二), (H, 一), (V, 一), (V, 二), (V, 三)]
现在,我想从原始帧 ( df
) 中选择均值行和标准行,以获得满足上述元组集的索引值。我可以单独遍历每个元组,然后进行连接操作,但我想知道是否有更多 Pythonic / Pandas-ic(?) 方法来实现我想要的智能切片等(特别是因为元组的数量我的数据集数量以千计)?
谢谢!
PS:请注意,我的问题在于前 2 个级别的特定元组满足选择条件,所以我不能对get_level_values
.
解决方案
您可以使用unstack
and laterstack
将删除 nan 并使用where
between 将您不想要的行替换为 nan 的事实。
df_ = (df.unstack('third')
.where(lambda x: x[(0,'mean')].le(3))
.stack('third')
)
print (df_) #for me as I don't have the same random values
0 1 2 3
first second third
C two mean 1.0 3.0 7.0 8.0
std 9.0 0.0 0.0 9.0
H one mean 3.0 0.0 2.0 1.0
std 7.0 9.0 2.0 7.0
two mean 0.0 2.0 1.0 0.0
std 6.0 5.0 6.0 5.0
推荐阅读
- python - 如何使用 BeautifulSoup 或 Selenium 点击隐藏链接
- c# - 如何测量字符串宽度并指定语言脚本
- pandas - Pandas 的 `to_datetime` 可以解析 BCE 日期吗?
- sql - 在 SQL 中查找两个字符之间的差异
- android - 如何在firebase中获取孩子的唯一密钥
- javascript - 通过 fetch 发送时表单值似乎为空白
- reactjs - 如何在反应大日历月视图中仅选择一天
- google-cloud-platform - Firebase Functions / Cloud SQL (mysql) / Knex 累积连接
- php - (Spotify) 如何停止跨浏览器会话共享?
- bots - Discord bot 使用 discord.py 命令不起作用.PLZ