【问题标题】:Optimization problem with Pandas apply and multiIndex search [duplicate]熊猫应用和多索引搜索的优化问题[重复]
【发布时间】:2018-11-12 11:00:34
【问题描述】:

所以,我想知道我这样做是否正确,因为也许有更好的方法可以做到这一点,而我正在浪费很多时间。

我有一个 3 级索引数据框,如下所示:

IndexA IndexB IndexC   ColumnA  ColumnB
   A      B      C1      HiA     HiB
   A      B      C2      HiA2    HiB2

我需要搜索每一行,保存其他行的数据。我知道这听起来很奇怪,但对我的数据来说是有意义的。例如: 我想将第二行中的 ColumnB 数据添加到第一行,反之亦然,如下所示:

IndexA IndexB IndexC   ColumnA  ColumnB  NewData
   A      B      C1      HiA     HiB       HiB2
   A      B      C2      HiA2    HiB2      HiB

为了进行此搜索,我在我的 df 上执行了 apply,如下所示:

df['NewData'] = df.apply(lambda r: my_function(df, r.IndexA, r.IndexB, r.IndexC), axis=1)

我的功能在哪里:

def my_function(df, indexA, indexB, indexC):
    idx = pd.IndexSlice
    #Here I do calculations (substraction) to know what C exactly I want
    #newIndexC = C - someConstantValue
    try:
        res = df.loc[idx[IndexA, IndexB, newIndexC],'ColumnB']
        return res
    except KeyError:
        return -1

我试图简化很多这个问题,如果这听起来令人困惑,很抱歉。基本上我的数据框有 2000 万行,这个搜索需要 2 个小时。我知道这需要很多时间,因为有很多访问,但我想知道是否有更快的方法来进行此搜索。

更多信息:

  • 在 indexA 上,我有不同的值组。示例:国家/地区。
  • 在 indexB 上,我有不同的日期组。
  • 在 indexC 上,我有不同的值组。

答案:

df['NewData'] = df.groupby(level=['IndexA', 'IndexB'])['ColumnB'].shift(7)

【问题讨论】:

  • 我建议您根据您的公式添加新的new_ColumnBnew_ColumnC 列,而不是修改索引。最后设置新的索引。
  • @has我做不到,修改索引C的重点是知道它是否存在。如果我添加一个新列,它就会存在,我会得到错误的数据。
  • 问题的整个有趣部分是您省略的部分(“我在这里进行计算”)。请包括在内。
  • @JohnZwinck 我写的,它只是 C 的减法 - 一个常量值。不再进行计算。

标签: python pandas optimization apply multi-index


【解决方案1】:

你真正在做的只是一个转变。您可以像这样将其加速 1000 倍:

df['NewData'] = df['ColumnB'].shift(-someConstantValue)

您需要将数据从顶部someConstantValue 行数滚动到底部--我将把它留作练习。

【讨论】:

  • 糟糕,我不能使用 shift,因为我会混合数据。我在问题中添加了更多信息。希望现在更清楚了,对不起!
  • 想到这里,我发现我完全误解了这个问题,因此这不是解决方案。我应该编辑这个吗?创建一个新问题?
  • 只需创建一个新问题并在此处的评论中发布指向它的链接。
  • stackoverflow.com/questions/53260741/… 在这里!感谢您的宝贵时间。
猜你喜欢
  • 2015-08-19
  • 2020-12-18
  • 1970-01-01
  • 2021-03-15
  • 2010-10-26
  • 2016-10-16
  • 2019-01-19
  • 2019-01-26
  • 2016-06-13
相关资源
最近更新 更多