python - 使用 pandas 的高级索引屏蔽/修改值
问题描述
df
我尝试通过屏蔽一些值来更新 MultiIndex 列数据框,如下所示。我无法找到正确的语法。有没有办法重新索引states_df
以便有两列级别?或者有没有简单的方法?
# -*- coding: utf-8 -*-
"""
Created on Thu Jul 2 18:31:31 2020
@author: ancollet
"""
import numpy as np
import pandas as pd
def generate_series():
return pd.Series(np.random.randn(1, 5)[0], [1, 2, 3, 4, 5])
# initial labels
iterables = [['U', 'acidity', 'Al'], ['TSU16_PR']]
# transform it to tuples
columns = pd.MultiIndex.from_product(iterables, names=['elment', 'asset'])
# build a multi-index from it
df = pd.DataFrame(columns=columns)
# Add data
df['U', 'TSU16_PR'] = generate_series()
df['acidity', 'TSU16_PR'] = generate_series()
df['Al', 'TSU16_PR'] = generate_series()
df['U', 'TSU17_PR'] = generate_series()
df['U', 'TSU18_PR'] = generate_series()
states_df = pd.DataFrame([[0.0, 1.0, 0.0],
[1.0, 1.0, 1.0],
[1.0, 0.0, 1.0],
[1.0, 1.0, 1.0],
[0.0, 1.0, 1.0]],
columns=['TSU16_PR', 'TSU17_PR', 'TSU18_PR'],
index=[1, 2, 3, 4, 5])
# This is not working since df and states do not have the same number of dimensions
df.loc[:, (slice(None),slice(None))].where(states_df != 0, np.nan, inplace=True)
我知道我可以通过这种方式实现它,所以它可能没什么大不了的。这是所需的输出:
arrays = [['U', 'acidity', 'Al', 'U', 'U'],
['TSU16_PR', 'TSU16_PR', 'TSU16_PR', 'TSU17_PR', 'TSU18_PR']]
tuples = list(zip(*arrays))
columns = pd.MultiIndex.from_tuples(tuples, names=['elment', 'asset'])
states_df_2 = pd.DataFrame([[0.0, 0.0, 0.0, 1.0, 0.0],
[1.0, 1.0, 1.0, 1.0, 1.0],
[1.0, 1.0, 1.0, 0.0, 1.0],
[1.0, 1.0, 1.0, 1.0, 1.0],
[0.0, 0.0, 0.0, 1.0, 1.0]],
columns=columns,
index=[1, 2, 3, 4, 5])
df.where(states_df_2 != 0, np.nan, inplace = True)
In[1]: df
Out[1]:
elment U acidity Al U
asset TSU16_PR TSU16_PR TSU16_PR TSU17_PR TSU18_PR
1 NaN NaN NaN 0.188960 NaN
2 1.920012 -1.355612 0.514419 -0.648037 0.461363
3 0.196968 -1.292682 -0.484867 NaN 0.373522
4 -0.340107 0.764010 1.081631 -0.141903 0.530718
5 NaN NaN NaN -0.732350 -1.148502
解决方案
您可以使用DataFrame.reindex
掩码并传递给DataFrame.where
:
df = df.where(states_df.reindex(df.columns, level=1, axis=1) != 0)
print (df)
elment U acidity Al U
asset TSU16_PR TSU16_PR TSU16_PR TSU17_PR TSU18_PR
1 NaN NaN NaN -0.434351 NaN
2 0.997345 -2.426679 -0.094709 2.205930 1.490732
3 0.282978 -0.428913 1.491390 NaN -0.935834
4 -1.506295 1.265936 -0.638902 1.004054 1.175829
5 NaN NaN NaN 0.386186 -1.253881
详情:
print (states_df.reindex(df.columns, level=1, axis=1) != 0)
elment U acidity Al U
asset TSU16_PR TSU16_PR TSU16_PR TSU17_PR TSU18_PR
1 False False False True False
2 True True True True True
3 True True True False True
4 True True True True True
5 False False False True True
推荐阅读
- opencv - “[WARN:0] 全局 SourceReaderCB::~SourceReaderCB 终止异步回调”警告
- javascript - 根据不同的参数从数组中查询多个对象并返回所有对象的总数
- ruby - Rails 4 Delayed_job 错误 - 作业加载失败:未定义的类/模块 CustomJob
- windows - 在多个屏幕中打开 putty 并加载 uid 和 pwd 的批处理脚本
- css - 语义反应/背景图像和高度 100 vh
- php - 无论设置如何,PHP 会话都会注销
- r - 使用回归预测的对数变化值来预测未来价格
- excel - 引用文件名不断变化的工作簿 - 解决方案建议?
- google-apps-script - 从谷歌表复制 A1 值并复制到其他谷歌表 B 列中的第一个空行
- python - Python不在for循环中打印文件内容