【问题标题】:Making calculations with Multiindex columns使用多索引列进行计算
【发布时间】:2020-06-16 18:05:34
【问题描述】:
import pandas as pd
import numpy as np

midx = pd.MultiIndex(levels = [['A', 'B'], ['x', 'y', 'z']],
                     codes = [[1, 1, 1, 0, 0, 0], [2, 1, 0, 2, 1, 0]])

df = pd.DataFrame([[0.8, 0.4, 0.3],
                   [0.6, 1.0, 0.1],
                   [0.1, 0.9, 0.5],
                   [0.4, 1.3, 0.6],
                   [0.3, 0.7, 0.4],
                   [2.3, 1.0, 0.2]], columns = ['K', 'L', 'M'], index = midx)

print(df)

       K    L    M
B z  0.8  0.4  0.3
  y  0.6  1.0  0.1
  x  0.1  0.9  0.5
A z  0.4  1.3  0.6
  y  0.3  0.7  0.4
  x  2.3  1.0  0.2

我在这个结构中有多索引数据框,这是我想要计算的:

df.loc['B', 'M'] = (df.loc['B', 'K'] + df.loc['A', 'K']).div(df.loc['B', 'L'] + df.loc['A', 'L']) 

作为这个过程的结果,所有值都是 NaN。我该如何解决这个问题?

【问题讨论】:

    标签: python pandas indexing multi-index divide


    【解决方案1】:

    有缺失值,因为adf.loc['B', 'M'].index的索引不同,解决办法是创建MultiIndex,例如MultiIndex.from_product:

    a = (df.loc['B', 'K'] + df.loc['A', 'K']).div(df.loc['B', 'L'] + df.loc['A', 'L']) 
    a.index = pd.MultiIndex.from_product([['B'], a.index])
    df.loc['B', 'M'] = a
    print (df)
           K    L         M
    B z  0.8  0.4  0.705882
      y  0.6  1.0  0.529412
      x  0.1  0.9  1.263158
    A z  0.4  1.3  0.600000
      y  0.3  0.7  0.400000
      x  2.3  1.0  0.200000
    

    另一个想法是转换为numpy数组,但如果a中的索引排序与df.loc['B', 'M'].index不同,则应该以错误的顺序分配数据:

    df.loc['B', 'M'] = a.to_numpy()
    print (df)
           K    L         M
    B z  0.8  0.4  0.705882
      y  0.6  1.0  0.529412
      x  0.1  0.9  1.263158
    A z  0.4  1.3  0.600000
      y  0.3  0.7  0.400000
      x  2.3  1.0  0.200000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      相关资源
      最近更新 更多