Skip to main content
 首页 » 编程设计

python之根据另一个索引值修改 DataFrame 索引中的值

2025年05月04日14kenshinobiy

我不熟悉 pandas 和索引,尤其是 MultiIndex。我有一个这样的数据框:

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值(value)。

例如,如果 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 

请您参考如下方法:

你可以先修改dataframe,然后pivot

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 

编辑:按照@Wen-Ben 的建议使用 np.select 的替代方法

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