首页 > 解决方案 > 根据另一个索引值修改 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'])

这会创建两个索引ResultType,但我想根据值修改Result索引中的Type值。

例如,如果Type == 'C'那么我希望对应Result的是-1.

另一个例子是如果Type in ('A', 'B')我想设置Result0 if < 0.5 else 1

我如何以编程方式执行此操作而不遍历每一行/列?

的输出piv.Result看起来像:

Measurement     ScanA   ScanB
ID      
1               0.0     -1
2               0.0     1

标签: pythonpandas

解决方案


您可以先修改数据框,然后旋转

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'])

推荐阅读