gpt4 book ai didi

python - dtype 对象的累积操作

转载 作者:太空狗 更新时间:2023-10-30 02:28:30 25 4
gpt4 key购买 nike

我想弄清楚如何将累积函数应用于对象。对于数字,有多种选择,例如 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() 不适用于对象数据类型。我正在寻找一种支持将函数应用于这两个输入的通用解决方案:先前的结果和当前元素。

最佳答案

事实证明这是做不到的。

继续同一样本:

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]

如果列的类型是对象,则永远不会调用该函数。 pandas 没有适用于对象的替代方法。 rolling().apply() 也一样.

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

所以答案是:如果您的数据不是数字,并且函数依赖于先前的结果和当前元素,则只需使用 for 循环。无论如何都会更有效率。

关于python - dtype 对象的累积操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36717416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com