Python 如何在列的多索引中进行数学运算?
我想在multindex列上执行一个简单的数学运算。 以下面代码中举例的多重索引为例。在第一次迭代中, 以下变量的值应如下所示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
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
…然后取消堆叠
它们(并重新排序),如果您希望它再次“宽”: