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]
为了输出!!!
我目前面临 "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]
为了输出!!!