Изменить несколько значений в нижнем уровне MultiIndex DataFrame - PullRequest
1 голос
/ 19 марта 2019

Рассмотрим следующий 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?

1 Ответ

1 голос
/ 19 марта 2019

Вы можете умножить на DataFrame.mul:

df = df.mul(df_scale, level=1, axis=0)
#if want multiple by column 0
#df = df.mul(df_scale[0], level=1, axis=0)
print (df)
              0
foo A  0.000000
    B  0.393081
    C  2.495880
bar A  0.000000
    B  0.880499
    C  1.196688
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...