Python 将方法应用于熊猫中的多个数据集

Python 将方法应用于熊猫中的多个数据集,python,pandas,Python,Pandas,我想使用.assign方法将多个lambda函数分配给多个数据集。到目前为止,我尝试了for循环,但没有成功: 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

我想使用
.assign
方法将多个lambda函数分配给多个数据集。到目前为止,我尝试了for循环,但没有成功:

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)
编辑:

以下操作也不起作用:

for data in [a,b]:
    data = data.assign(c = lambda x: x.a+x.b,
                d = lambda x: x.a^x.b)

这不起作用的主要原因是,
asign
不会修改现有的dataframe,而是返回一个新的dataframe对象

您要做的是将相同的函数应用于多个对象,这正是
map
函数的作用:

def分配(df):
返回df.assign(c=lambda x:x.a+x.b,
d=λx:x.a^x.b)
(a,b)=映射(分配(a,b))
更一般的解决方案如下:

#假设我们无法控制以下代码行:
数据帧=(a,b)
#我们仍然可以使用相同的解决方案:
数据帧=元组(映射(分配,数据帧))
打印(数据帧[0])
关于您的编辑,这不起作用的原因有点有趣。这在您的代码中可能不明显,但在下面的代码中:

a=[1,2,3]
数据=a
数据=[4,5,6]
打印(数据)
这里很清楚,这个输出是
[4,5,6]
而不是
[1,2,3]

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

  • data=a
    data
    绑定到与
    a
    相同的对象(分别为
    b
  • data=…
    :创建一个新的绑定,保持
    a
    的现有绑定未被触及(因为
    data
    仅绑定到与
    a
    相同的对象,
    data
    从来都不是
    a
    最后,
    对于[a,b]中的数据:
    并不意味着
    数据
    在下一次迭代中将成为
    a
    (分别为
    b
    )的别名。(这是您在编写本文时所期望的。)相反,对于[a,b]中的数据:相当于:

    data=a
    #第一次迭代
    数据=b
    #第二次迭代
    
    这不起作用,因为
    asign
    不会修改现有的数据帧,而是返回一个新的数据帧对象。我想实际上您想要一个适用于任意数量数据帧的解决方案?请查看此答案,谢谢!我编辑了这个问题,因为我忘了放一个
    data=data.assign…
    你应该让你的代码保持原样,否则人们阅读答案时,问题将不理解发生了什么^^^我也编辑了,以获得这个问题的完整答案。我希望这是有意义的,如果您有任何问题,请告诉我,因为我认为这是一个有趣的问题/答案,以便正确和明确。