Рассмотрим следующий DataFrame:
import numpy as np
import pandas as pd
arrays = [['foo', 'foo', 'foo', 'bar', 'bar', 'bar'],
['A', 'B', 'C', 'A', 'B', 'C']]
tuples = list(zip(*arrays))
index_values = pd.MultiIndex.from_tuples(tuples)
df = pd.DataFrame(np.random.rand(6), index = index_values)
print(df)
0
foo A 0.726699
B 0.001700
C 0.936495
bar A 0.298490
B 0.167234
C 0.476725
Скажем, я хочу масштабировать df со следующими значениями:
df_scale = pd.DataFrame([0,1,4], index=['A','B','C'])
print(df_scale)
0
A 0
B 1
C 4
То есть я хочу, чтобы все A были умножены на 0,все B на 1, и все C на 4.
В настоящее время я использую следующий подход:
df_new = df.copy()
list_df_new_index = list(df_new.index)
for index in list_df_new_index:
cntr, prod = index
df_new.loc[cntr, prod] = df_new.loc[cntr, prod]*df_scale.loc[prod]
print(df_new)
0
foo A 0.000000
B 0.001700
C 3.745981
bar A 0.000000
B 0.167234
C 1.906900
Хотя это работает, я не могу не думать, что есть функция внутрипанды, которые позволили бы мне сделать это.
Я прошел ответы на вопросы Выбор строк в пандах MultiIndex DataFrame .
Сначала я подумал, что могу использовать df.xs (), но если я правильно понимаю, это позволяет мне только выбирать, а не изменять значения.
Затем я посмотрел в pd.IndexSlice (), но не понимаю, как я могу использовать это для изменения нескольких значений.
Предоставляет ли панда функциональность изменения нескольких значений в более низкомуровень MultiIndex DataFrame?