【问题标题】:Reducing dimensionality of multiindex pandas dataframe using apply使用 apply 减少多索引 pandas 数据框的维数
【发布时间】:2018-08-22 22:09:47
【问题描述】:

我有以下数据框:

df = pd.DataFrame({('psl', 't1'): {'fiat': 36.389809173765507,
  'mazda': 18.139242981049016,
  'opel': 0.97626485600703961,
  'toyota': 74.464422292108878},
 ('psl', 't2'): {'fiat': 35.423004380643462,
  'mazda': 24.269803148695079,
  'opel': 1.0170540474994665,
  'toyota': 60.389948228586832},
 ('psv', 't1'): {'fiat': 35.836800462163097,
  'mazda': 15.893295606055901,
  'opel': 0.78744853046848606,
  'toyota': 74.054850828062271},
 ('psv', 't2'): {'fiat': 34.379812557124815,
  'mazda': 23.202587247335682,
  'opel': 0.80191294532382451,
  'toyota': 58.735083244244322}})

看起来像这样:

我希望将它从多索引减少到普通索引。我希望通过应用一个使用 t1 和 t2 值的函数并仅返回一个值来做到这一点,这将导致有两列:psl 和 psv。

我已经成功地将它分组并应用了一个函数:

df.groupby(level=0, axis=1).agg(np.mean) 

这与我想要的非常接近,只是我不想应用 np.mean,而是一个自定义函数。特别是百分比变化函数。

我的最终目标是能够做这样的事情:

df.groupby(level=0, axis=1).apply(lambda t1, t2: (t2-t1)/t1)

返回此错误:

TypeError: <lambda>() missing 1 required positional argument: 't2'

我也试过这个:

df.apply(lambda x: x[x.name].apply(lambda x: x['t1']/x['t2']))

反过来又返回:

KeyError: (('psl', 't1'), 'occurred at index (psl, t1)')

能否请您尽自己最大的努力对答案的每个部分进行详尽的解释,以便我更好地了解 pandas 的工作原理。

【问题讨论】:

    标签: python-3.x pandas dataframe pandas-groupby pandas-apply


    【解决方案1】:

    不容易。在列中使用squeeze 的自定义函数Seriesxs 选择MultiIndex

    def f(x):
        t2 = x.xs('t2', axis=1, level=1)
        t1 = x.xs('t1', axis=1, level=1)
        a = (t2-t1)/t1
        #print (a)
        return (a.squeeze())
    
    df1 = df.groupby(level=0, axis=1).agg(f) 
    print (df1)
                 psl       psv
    fiat   -0.026568 -0.040656
    mazda   0.337972  0.459898
    opel    0.041781  0.018369
    toyota -0.189009 -0.206871
    

    使用 lambda 函数是可能的,但重复代码真的很糟糕:

    df1 = df.groupby(level=0, axis=1)
            .agg(lambda x: ((x.xs('t2', axis=1, level=1)-x.xs('t1', axis=1, level=1))/
                                     x.xs('t1', axis=1, level=1)).squeeze()) 
    

    【讨论】:

      猜你喜欢
      • 2020-10-22
      • 1970-01-01
      • 2017-09-11
      • 2017-08-19
      • 1970-01-01
      • 2021-02-24
      • 2019-02-01
      • 2019-07-23
      相关资源
      最近更新 更多