【问题标题】:How to append MultiIndex rows to empty pandas dataframe如何将 MultiIndex 行附加到空的熊猫数据框
【发布时间】:2021-12-07 17:54:45
【问题描述】:

我想做这样的事情:

df = pd.DataFrame()
for row_ind1 in range(3):
    for row_ind2 in range(3:6):
        for col in range(6:9):
            entry = row_ind1 * row_ind2 * col
            df.loc[[row_ind1, row_ind2], col] = entry           

然后出去:

     6 7 8
0 3  x x x
  4  x x x
  5  x x x
1 3  x x x
  4  x x x
  5  x x x
2 3  x x x
  4  x x x
  5  x x x

(作为奖励,获胜者可以填写答案。)

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    可以预初始化具有 2 个级别的 MultiIndex,以允许使用 loc 的设置按预期工作:

    # Pre-initialise a MultiIndex
    df = pd.DataFrame(index=pd.MultiIndex.from_arrays([[], []]))
    for row_ind1 in range(3):
        for row_ind2 in range(3, 6):
            for col in range(6, 9):
                entry = row_ind1 * row_ind2 * col
                df.loc[(row_ind1, row_ind2), col] = entry
    

    df:

            6     7     8
    0 3   0.0   0.0   0.0
      4   0.0   0.0   0.0
      5   0.0   0.0   0.0
    1 3  18.0  21.0  24.0
      4  24.0  28.0  32.0
      5  30.0  35.0  40.0
    2 3  36.0  42.0  48.0
      4  48.0  56.0  64.0
      5  60.0  70.0  80.0
    

    尽管在 MultiIndex 和列上使用 broadcasted 乘法和 numpy 来构建 DataFrame 并使用 MultiIndex.from_product 独立创建索引和列可能更容易:

    import numpy as np
    import pandas as pd
    
    idx = pd.MultiIndex.from_product([[0, 1, 2], [3, 4, 5]]).to_frame()
    cols = np.array([6, 7, 8])
    
    df = pd.DataFrame((idx[0] * idx[1]).to_numpy()[:, None] * cols,
                      index=idx.index,
                      columns=cols)
    

    df:

          6   7   8
    0 3   0   0   0
      4   0   0   0
      5   0   0   0
    1 3  18  21  24
      4  24  28  32
      5  30  35  40
    2 3  36  42  48
      4  48  56  64
      5  60  70  80
    

    【讨论】:

    • 非常感谢您提供清晰而简单的解决方案。为了举例,我简化了我的问题;第一个解决方案是我一直在寻找的,但两者都有帮助。
    • 经过进一步审查,我注意到您在 loc 中使用了元组 (()) 而不是数组 ([])。这是个人偏好还是记录为最佳实践?
    • 元组是多索引访问所必需的。列表用于多索引选择。在多索引中,每个索引都是一个元组。
    • 知道了!因为我们正在处理标量值,所以这是一个使用 at 而不是 loc 的地方吗?
    • 这里atloc在效果上没有区别。尽管您可能正确地认为at 会更“清晰”,因为我们将单个值“置于”特定单元格。
    猜你喜欢
    • 2022-11-25
    • 2019-10-22
    • 2018-09-29
    • 2023-02-01
    • 2018-02-08
    • 2017-06-13
    • 2014-01-03
    • 1970-01-01
    • 2015-10-20
    相关资源
    最近更新 更多