首页 > 解决方案 > 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)

标签: pythonpandas

解决方案


这不起作用的主要原因是它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].

您的代码和最后一个代码中发生的情况是相同的:

  1. data = a:绑定到与(resp. )data相同的对象ab
  2. data = ...: 创建一个新的绑定,保持现有的绑定a不变(因为data只绑定到与 相同的对象adata从来没有a)。

最后,for data in [a, b]: 并不意味着在下一次迭代期间data它将成为( resp. ) 的别名。(这是你在写这篇文章时可能期望的。)相反,它等同于:abfor data in [a, b]:

data = a
# 1st iteration
data = b
# 2nd iteration

推荐阅读