python - Applying methods to multiple datasets in pandas
问题描述
I would like to use the .assign
method with multiple lambda functions to multiple datasets. So far, I've tried with a for loop without success:
a = pd.DataFrame({'a': np.arange(5),
'b': np.arange(5)})
b = pd.DataFrame({'a': np.arange(5,10),
'b': np.arange(5,10)})
for data in [a,b]:
data.assign(c = lambda x: x.a+x.b,
d = lambda x: x.a^x.b)
Edit:
The following doesn't work either:
for data in [a,b]:
data = data.assign(c = lambda x: x.a+x.b,
d = lambda x: x.a^x.b)
解决方案
这不起作用的主要原因是它asign
没有修改现有的数据框,而是返回一个新的数据框对象。
您想要做的是将相同的函数应用于多个对象,这正是该map
函数的用途:
def assign(df):
return df.assign(c = lambda x: x.a+x.b,
d = lambda x: x.a^x.b)
(a, b) = map(assign, (a,b))
更通用的解决方案如下:
# Imagine we don't have control over the following line of code:
dataframes = (a, b)
# We can still use the same solution:
dataframes = tuple(map(assign, dataframes))
print(dataframes[0])
关于您的编辑,这不起作用的原因更有趣。在您的代码中可能看起来并不明显,但它会在这个代码中:
a = [1, 2, 3]
data = a
data = [4, 5, 6]
print(data)
这里很明显,这个输出[4, 5, 6]
而不是[1, 2, 3]
.
您的代码和最后一个代码中发生的情况是相同的:
data = a
:绑定到与(resp. )data
相同的对象a
b
data = ...
: 创建一个新的绑定,保持现有的绑定a
不变(因为data
只绑定到与 相同的对象a
,data
从来没有a
)。
最后,for data in [a, b]:
并不意味着在下一次迭代期间data
它将成为( resp. ) 的别名。(这是你在写这篇文章时可能期望的。)相反,它等同于:a
b
for data in [a, b]:
data = a
# 1st iteration
data = b
# 2nd iteration