我不熟悉 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'])
