当前位置: 首页 > 面试题库 >

dtype对象上的累积操作

贾骏
2023-03-14
问题内容

我试图弄清楚如何将累积函数应用于对象。对于数字,有多种选择,例如cumsumcumcount。还有df.expanding可以与一起使用apply。但是我传递给我的功能apply不适用于对象。

import pandas as pd
df = pd.DataFrame({"C1": [1, 2, 3, 4], 
                   "C2": [{"A"}, {"B"}, {"C"}, {"D"}], 
                   "C3": ["A", "B", "C", "D"], 
                   "C4": [["A"], ["B"], ["C"], ["D"]]})

df
Out: 
   C1   C2 C3   C4
0   1  {A}  A  [A]
1   2  {B}  B  [B]
2   3  {C}  C  [C]
3   4  {D}  D  [D]

在数据框中,我具有整数值,集合,字符串和列表。现在,如果我尝试一下,expanding().apply(sum)我有累加的总和:

df.expanding().apply(sum)
Out[69]: 
     C1   C2 C3   C4
0   1.0  {A}  A  [A]
1   3.0  {B}  B  [B]
2   6.0  {C}  C  [C]
3  10.0  {D}  D  [D]

我的期望是,由于求和是在列表和字符串上定义的,所以我会得到如下信息:

     C1   C2  C3     C4
0   1.0  {A}  A      [A]
1   3.0  {B}  AB     [A, B]
2   6.0  {C}  ABC    [A, B, C]
3  10.0  {D}  ABCD   [A, B, C, D]

我也尝试过这样的事情:

df.expanding().apply(lambda r: reduce(lambda x, y: x+y**2, r))
Out: 
     C1   C2 C3   C4
0   1.0  {A}  A  [A]
1   5.0  {B}  B  [B]
2  14.0  {C}  C  [C]
3  30.0  {D}  D  [D]

它按我的预期工作:以前的结果是x,当前行的值是y。但是x.union(y)例如,我不能减少使用。

因此,我的问题是:expanding我可以在对象上使用其他替代方法吗?该示例只是为了表明它expanding().apply()不适用于对象dtypes。我正在寻找一种通用解决方案,该解决方案支持将函数应用于这两个输入:先前的结果和当前的元素。


问题答案:

事实证明这是无法完成的。

继续相同的示例:

def burndowntheworld(ser):
    print('Are you sure?')
    return ser/0

df.select_dtypes(['object']).expanding().apply(burndowntheworld)
Out: 
    C2 C3   C4
0  {A}  A  [A]
1  {B}  B  [B]
2  {C}  C  [C]
3  {D}  D  [D]

如果列的类型是对象,则永远不会调用该函数。熊猫没有其他适用于对象的替代品。相同rolling().apply()

从某种意义上说,这是一件好事,因为expanding.apply使用自定义函数具有O(n **
2)复杂度。对于诸如等的特殊情况cumsumewma操作的递归性质可以将线性时间的复杂度降低,但是在最一般的情况下,它应该为前n个元素,然后为前n
+
1个元素计算函数,依此类推。因此,特别是对于仅依赖于当前值和函数先前值的函数,扩展效率很低。更不用说将列表或集合存储在DataFrame中从来不是一个好主意。


因此答案是:如果您的数据不是数字,并且函数取决于先前的结果和当前元素,则只需使用for循环即可。无论如何,它将更有效率。



 类似资料:
  • 问题内容: 我已经实现了一定数量的所有素数的列表。我试图做的事情很难解释,所以我只用一些硬代码展示一下: 所以从本质上讲,我试图从上一个列表中按顺序取出一个元素,然后按指数倍增,然后将其追加到其他列表中。 我意识到我可以做到这一点,这可能会更容易: 我需要一些想法才能在某种程度上做到这一点。 问题答案: 您需要 累积产品 清单。这是一个简单的食谱: 另一种方法,使用itertools: 或者,也许

  • 我想知道为什么需要(又名reduce)第3个参数。对于那些不知道是什么的人,它的用法如下: 调用等同于: 还有可选第4个参数,它允许用任何其他操作替换加法。 我听说的一个基本原理是,如果你不需要加起来,而是乘一个向量的元素,我们需要其他的(非零)初始值: 但是为什么不像Python那样-为设置初始值,并使用从开始的范围。类似这样的事情: 这对任何行动都管用。为什么需要第三个参数?

  • 我试图实现列表中对象值的累积和。 对象如下所示: 我有一份清单 结果也应该是一个列表 如何使用Java流API实现它? 输入示例为: 所需输出为:

  • 问题内容: 我有这张桌子: 仅第一行具有OnHand值的原因是因为我可以从另一个存储任何股票代码的当前数量的表中获得该值。 该表中的其他记录取自另一个表,该表记录了给定日期的所有移动。 我想更新上表,以便OnHand列基于上一条记录的存量和移动显示该行日期的QtyOnHand,这样在更新结束时看起来像这样: 我目前正在使用CURSOR实现这一目标。但是性能确实吸引了成千上万的记录。 我可以运行一些

  • 我正在编写一个使用NIO套接字的Java应用程序。它由3台服务器和一组客户端组成。客户端可以与服务器通信,服务器可以与客户端和其他服务器通信。 服务器到服务器和客户端到服务器发送序列化为< code>byte[]数组的< code >消息。每个< code >消息的第一个字节包含消息的大小,自然保证每个消息不包含超过< code>127 (2^8 -1)字节。您可以将服务器和客户端的消息发送视为循

  • 我试图解剖一个深度嵌套的对象。遍历它并将数据拉到一个单个级别的对象,然后再与一个更大的对象结合在一起。我可以用下面的代码遍历它,但它不是动态的。这只有在我知道它的4个物体深度的情况下才起作用。实际上它可以是1->n深。我还有一个函数,它在该级别检查值的类型,并对其进行相应的处理。现在这对我很管用 这里是顶层 下面是每一个级别: 希望这是足够的上下文来了解我当前在做什么。现在,我有数据可以通过一个数