functools reduce 就地修改原始数据框

functools reduce In-Place modifies original dataframe

我目前面临 "functools.reduce(operator.iadd,...)" 改变原始输入的问题。例如

我有一个简单的数据框 df = pd.DataFrame([[['A', 'B']], [['C', 'D']]])

        0
0  [A, B]
1  [C, D]

应用 iadd 运算符会导致以下结果:

functools.reduce(operator.iadd, df[0])
['A', 'B', 'C', 'D']

现在,原来的df变成了

              0
0  [A, B, C, D]
1        [C, D]

预先使用 df.copy(deep=True) 复制 df 也无济于事。

有没有人有解决这个问题的想法? 谢谢,Lazloo

使用operator.add代替operator.iadd:

In [8]: functools.reduce(operator.add, df[0])
Out[8]: ['A', 'B', 'C', 'D']

In [9]: df
Out[9]: 
        0
0  [A, B]
1  [C, D]

毕竟operator.iadd(a, b)a += b是一样的。所以它修改了df[0]。反之,operator.add(a, b)returnsa + b,所以没有修饰df[0].


或者,您可以使用 df[0].sum():

计算相同的数量
In [39]: df[0].sum()
Out[39]: ['A', 'B', 'C', 'D']

docs for df.copy 警告:

When deep=True, data is copied but actual Python objects will not be copied recursively, only the reference to the object.

由于 df[0] 包含 Python 个列表,即使 df.copy(deep=True) 也不会复制列表。这就是为什么修改副本仍然影响 df.

除了@unutbu的好回答,还​​可以使用int.__add__的方法:

df = pd.DataFrame([[['A', 'B']], [['C', 'D']]])
functools.reduce(lambda x,y: (x).__add__(y), df[0])
print(df)

你可以看到它是:

        0
0  [A, B]
1  [C, D]

为了输出!!!