Умножьте строки в многоиндексном DataFrame на разные строки в другом многоиндексном DataFrame. - PullRequest
2 голосов
/ 07 января 2020

У меня есть два больших многоиндексных Dataframes, оба выглядят примерно так:

                               2000 2001 2002 2003 ...
Area AreaCode Item  Unit Code  
A    A1       one   j    00    val  val  val  val
              two   k    01    val  val  val  val
              three k    10    val  val  val  val
B    B1       one   j    00    val  val  val  val
              two   k    01    val  val  val  val
              three k    10    val  val  val  val
              four  k    10    val  val  val  val
C    C1       one   j    00    val  val  val  val
              two   k    01    val  val  val  val
              three k    10    val  val  val  val

, где все val просто плавающие.

Я хочу умножить каждое значение на df1 на соответствующее значение в df2, деленное на np.sum(df2.xs("one", level = "Item"), axis = 1) перед использованием .mean(), что даст мне взвешенное среднее. Что-то вроде:

for area in df1.index.get_level_values("Area"):
   df1[area] = (df1[area] * df2.xs("one", level = "Item").xs(area, level = "Area").values) \
               / np.sum(df2.xs("one", level = "Item"), axis = 1)

В моих реальных данных, df1 и df2 имеют одинаковое количество столбцов. df1 содержит данные на душу населения, а df2.xs("one", level = "Item") - данные о временных рядах для каждого Area.

. Если есть простой способ сделать это с помощью .mean(), я не смог бы найти тот, который позволял бы взвешенное среднее.

Я также пытался использовать df1.multiply(df2.xs("one", level = "Item").xs(area, level = "Area"), level = "Area"), но получаю TypeError: cannot align on a multi-index with out specifying the join levels.

Я не привязан к этому методу; если есть простой способ получить взвешенное среднее с помощью .mean(), я бы с радостью использовал его.

...