python - 根据另一个索引值修改 DataFrame 索引中的值
问题描述
我是 pandas 的新手,我使用索引,尤其是 MultiIndex。我有一个这样的DataFrame:
df = pd.DataFrame({
'ID':[1,2,1,2],
'Measurement': ['ScanA', 'ScanA', 'ScanB', 'ScanB'],
'Result':[0.1,0.2,0.5,0.7],
'ResultType':['A','B','C','B']})
piv = df.pivot(index = 'ID', columns = 'Measurement', values = ['Result', 'ResultType'])
这会创建两个索引Result
和Type
,但我想根据值修改Result
索引中的Type
值。
例如,如果Type == 'C'
那么我希望对应Result
的是-1
.
另一个例子是如果Type in ('A', 'B')
我想设置Result
为0 if < 0.5 else 1
我如何以编程方式执行此操作而不遍历每一行/列?
的输出piv.Result
看起来像:
Measurement ScanA ScanB
ID
1 0.0 -1
2 0.0 1
解决方案
您可以先修改数据框,然后旋转
df.loc[df['Type'] == 'C', 'Result'] = -1
df.loc[(df['Type'].isin(['A', 'B'])) & (df['Result'] < 0.5), 'Result'] = 0
df.loc[(df['Type'].isin(['A', 'B'])) & (df['Result'] >= 0.5), 'Result'] = 1
df.pivot(index = 'ID', columns = 'Measurement', values = ['Result', 'Type'])
Result Type
Measurement ScanA ScanB ScanA ScanB
ID
1 0 1 A A
2 0 -1 B C
编辑:使用 np.select 作为@Wen-Ben 建议的替代方案
cond = [df['Type'] == 'C', (df['Type'].isin(['A', 'B'])) & (df['Result'] < 0.5), (df['Type'].isin(['A', 'B'])) & (df['Result'] >= 0.5)]
choice = [-1, 0, 1]
df['Result'] = np.select(cond, choice)
df.pivot(index = 'ID', columns = 'Measurement', values = ['Result', 'Type'])
推荐阅读
- react-native - 在反应原生的屏幕之间传递不可序列化的对象
- r - 尽管使用 scale_fill_manual(),ggplotly() 仍忽略图例标签编辑
- javascript - JS 对象原型级别和继承复制或参考
- java - 具有默认接口方法的 Java 8 InvocationHandler
- javascript - 如何通过使用 ajax 调用按下按钮删除来删除数据库行
- python-3.x - Read .txt with emoji characters in python
- keycloak - ISPN 缓存的 Keycloak 和失效模式
- javascript - 如何使 ChartJS 中的 Line 不超过 yAxes 的最大值
- java - mouseListener 只识别 JLabel
- mongodb - Mongoose:删除项目 - 第一个总是被删除