【问题标题】:Populating a multiIndexed pandas Series填充多索引熊猫系列
【发布时间】:2018-03-25 04:12:12
【问题描述】:

我有一个充满数据的 pandas 数据框

import pandas as pd
import numpy as np

varNames = ["point1","point2","point3","point4","point5"]
df = pd.DataFrame(np.random.randn(5,2),index=varNames,columns=["data1","data2"])

我想创建一个带有由此创建的 multiIndex 的系列。我能做的索引:

iterables=[["point1","point2","point3"],["point4","point5"]]
index=pd.MultiIndex.from_product(iterables, names=['numerator', 'denominator'])

虽然我不知道如何填写这个系列。我在追求类似的东西

s = pd.Series(max(df.loc[index["numerator"]]/df.loc[index["denominator"]]),index=index)

我想将第一个数据帧中列为分子的每一行除以第一个数据帧中列为分母的每一行,从结果值行中找到最大值并将其存储在相关的将 (s[variableN,variableM]) 放在系列中。

这是我第一次使用这个多索引的东西,没有逐行遍历系列,计算出值并存储它,类似(我想,我不认为我能够完全理解这一点)this,我不知道该怎么做。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以将reindex 与参数levelmax 一起使用:

    df3 = df.reindex(index, level=0).div(df.reindex(index, level=1)).max(level=0)
    

    示例:

    np.random.seed(456)
    varNames = ["point1","point2","point3","point4","point5"]
    df = pd.DataFrame(np.random.randn(5,2),index=varNames,columns=["data1","data2"])
    print (df)
               data1     data2
    point1 -0.668129 -0.498210
    point2  0.618576  0.568692
    point3  1.350509  1.629589
    point4  0.301966  0.449483
    point5 -0.345811 -0.315231
    
    iterables=[["point1","point2","point3"],["point4","point5"]]
    index=pd.MultiIndex.from_product(iterables, names=['numerator', 'denominator'])
    

    df1 = df.reindex(index, level=0)
    print (df1)
                              data1     data2
    numerator denominator                    
    point1    point4      -0.668129 -0.498210
              point5      -0.668129 -0.498210
    point2    point4       0.618576  0.568692
              point5       0.618576  0.568692
    point3    point4       1.350509  1.629589
              point5       1.350509  1.629589
    
    df2 = df.reindex(index, level=1)
    print (df2)
                              data1     data2
    numerator denominator                    
    point1    point4       0.301966  0.449483
              point5      -0.345811 -0.315231
    point2    point4       0.301966  0.449483
              point5      -0.345811 -0.315231
    point3    point4       0.301966  0.449483
              point5      -0.345811 -0.315231
    
    print (df1.div(df2))
                              data1     data2
    numerator denominator                    
    point1    point4      -2.212594 -1.108405
              point5       1.932062  1.580459
    point2    point4       2.048493  1.265214
              point5      -1.788768 -1.804050
    point3    point4       4.472386  3.625472
              point5      -3.905339 -5.169509
    

    df3 = df.reindex(index, level=0).div(df.reindex(index, level=1)).max(level=0)
    print (df3)
                  data1     data2
    numerator                    
    point1     1.932062  1.580459
    point2     2.048493  1.265214
    point3     4.472386  3.625472
    
    
    df3 = (df.reindex(index, level=0).div(df.reindex(index, level=1))
            .max(level=0)
            .reindex(index, level=0))
    print (df3)
                              data1     data2
    numerator denominator                    
    point1    point4       1.932062  1.580459
              point5       1.932062  1.580459
    point2    point4       2.048493  1.265214
              point5       2.048493  1.265214
    point3    point4       4.472386  3.625472
              point5       4.472386  3.625472
    

    【讨论】:

    • 这...几乎可以工作。这将返回一个仅由分子索引的数据框。我追求的是一个由分子/分母组合多重索引的。
    • 效果很好,谢谢。现在我需要做的就是弄清楚发生了什么:)
    猜你喜欢
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2016-02-06
    • 2021-12-30
    • 2018-12-02
    • 2014-07-11
    相关资源
    最近更新 更多