【发布时间】:2018-03-02 17:03:22
【问题描述】:
我试图弄清楚如何将累积函数应用于对象。对于数字,有几种选择,例如 cumsum 和 cumcount。还有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。我正在寻找一个支持将函数应用于这两个输入的通用解决方案:先前的结果和当前元素。
【问题讨论】: