Python 如何在列的多索引中进行数学运算?

Python 如何在列的多索引中进行数学运算?,python,pandas,Python,Pandas,我想在multindex列上执行一个简单的数学运算。 以下面代码中举例的多重索引为例。在第一次迭代中, 以下变量的值应如下所示 par_1=4 par_2=6 par_3=8 根据方程(par_2+par_3+6)/par_1计算的BB应等于5。但是,在下面的代码中,它等于nan 在计算之后,我想将答案扩展到现有的df 请问解决这个问题的正确方法是什么 columns = pd.MultiIndex.from_product([['all_cal'], ['a0_b0', 'a0_b1','a

我想在multindex列上执行一个简单的数学运算。 以下面代码中举例的多重索引为例。在第一次迭代中, 以下变量的值应如下所示

par_1=4
par_2=6
par_3=8
根据方程
(par_2+par_3+6)/par_1
计算的
BB
应等于
5
。但是,在下面的代码中,它等于
nan

在计算之后,我想将答案扩展到现有的
df

请问解决这个问题的正确方法是什么

columns = pd.MultiIndex.from_product([['all_cal'], ['a0_b0', 'a0_b1','a0_b3','a1_b0', 'a1_b1','a1_b3']],
                                     names=['subject', 'type'])
data=np.array([[4,6,8,4,5,6]])
df = pd.DataFrame(data, columns=columns)

for idx in [0,1]:
    par_1=df.iloc[0, df.columns.get_level_values(1)==f'a{str(idx)}_b0']
    par_2=df.iloc[0, df.columns.get_level_values(1)==f'a{str(idx)}_b1']
    par_3=df.iloc[0, df.columns.get_level_values(1)==f'a{str(idx)}_b3']
    BB=(par_2+par_3+6) / par_1
    df.loc [0, ('all_cal', f'{str(idx)}_new_info')] = (par_2+par_3+6) / par_1
    df.loc [0, ('all_cal', f'{str(idx)}_new_other')] = (par_2*2) / par_1

使用索引和列名尝试
loc
,尤其是您必须使用两个列级别进行访问:

将numpy导入为np
作为pd进口熊猫
columns=pd.多索引,从[U乘积([[all_cal']、['a0_b0'、'a0_b1'、'a0_b3'、'a1_b0'、'a1_b1'、'a1_b3']],
名称=[“主题”,“类型”])
data=np.数组([[4,6,8,4,5,6]]
df=pd.DataFrame(数据,列=列)
idx=0
par_1=df.loc[idx,('all_cal','a0_b0')]
par_2=df.loc[idx,('all_cal','a0_b1')]
par_3=df.loc[idx,('all_cal','a0_b3')]
BB=(第2杆+第3杆+第6杆)/第1杆
打印(f“BB={BB}”)
df.loc[idx,(“所有校准”,“新信息”)]=(第2部分+第3部分+第6部分)/第1部分
df.loc[idx,(“所有校准”,“新的其他”)]=(第2*2部分)/第1部分
更详细的信息

PS:f字符串支持数值,因此可以避免使用
str(idx)
,例如:

print(f“f-strings支持这样的数字:{idx}”)

是有效字符串。

请使用索引和列名称尝试使用
loc
,尤其是您必须使用两个列级别进行访问:

将numpy导入为np
作为pd进口熊猫
columns=pd.多索引,从[U乘积([[all_cal']、['a0_b0'、'a0_b1'、'a0_b3'、'a1_b0'、'a1_b1'、'a1_b3']],
名称=[“主题”,“类型”])
data=np.数组([[4,6,8,4,5,6]]
df=pd.DataFrame(数据,列=列)
idx=0
par_1=df.loc[idx,('all_cal','a0_b0')]
par_2=df.loc[idx,('all_cal','a0_b1')]
par_3=df.loc[idx,('all_cal','a0_b3')]
BB=(第2杆+第3杆+第6杆)/第1杆
打印(f“BB={BB}”)
df.loc[idx,(“所有校准”,“新信息”)]=(第2部分+第3部分+第6部分)/第1部分
df.loc[idx,(“所有校准”,“新的其他”)]=(第2*2部分)/第1部分
更详细的信息

PS:f字符串支持数值,因此可以避免使用
str(idx)
,例如:

print(f“f-strings支持这样的数字:{idx}”)

是有效字符串。

作为替代,您可以以不同方式设置多索引:

columns = pd.MultiIndex.from_product([['a0', 'a1'], ['b0', 'b1','b3']],
                                     names=['subject', 'type'])
data=np.array([[4,6,8,4,5,6]])
df = pd.DataFrame(data, columns=columns)
print(df)

subject a0       a1      
type    b0 b1 b3 b0 b1 b3
0        4  6  8  4  5  6
然后,您可以堆叠
主题
级别来进行计算:

df = df.stack('subject')
df['new_info'] = (df['b1'] + df['b3'] + 6 ) / df['b0']
df['new_other'] = (2 * df['b1']**2) / df['b0']
print(df)
type       b0  b1  b3  new_info  new_other
  subject                                 
0 a0        4   6   8      5.00       18.0
  a1        4   5   6      4.25       12.5
…然后
取消堆叠
它们(并重新排序),如果您希望它再次“宽”:


或者,您可以以不同的方式设置多重索引:

columns = pd.MultiIndex.from_product([['a0', 'a1'], ['b0', 'b1','b3']],
                                     names=['subject', 'type'])
data=np.array([[4,6,8,4,5,6]])
df = pd.DataFrame(data, columns=columns)
print(df)

subject a0       a1      
type    b0 b1 b3 b0 b1 b3
0        4  6  8  4  5  6
然后,您可以堆叠
主题
级别来进行计算:

df = df.stack('subject')
df['new_info'] = (df['b1'] + df['b3'] + 6 ) / df['b0']
df['new_other'] = (2 * df['b1']**2) / df['b0']
print(df)
type       b0  b1  b3  new_info  new_other
  subject                                 
0 a0        4   6   8      5.00       18.0
  a1        4   5   6      4.25       12.5
…然后
取消堆叠
它们(并重新排序),如果您希望它再次“宽”: