Python 如何遍历dataframe中的一列并同时更新两个新列?

Python 如何遍历dataframe中的一列并同时更新两个新列?,python,numpy,pandas,dataframe,multiple-columns,Python,Numpy,Pandas,Dataframe,Multiple Columns,我知道我可以向dataframe中添加列,并将其值更新为函数返回的值,如下所示: df=pd.DataFrame({'x':[1,2,3,4]}) def square(x): return x*x df['x_squared'] = [square(i) for i in df['x']] df=pd.DataFrame({'x':[1,2,3,4]}) def square(x): return x*x df['x_squared'] = df['x_cubed']

我知道我可以向dataframe中添加列,并将其值更新为函数返回的值,如下所示:

df=pd.DataFrame({'x':[1,2,3,4]})

def square(x):
    return x*x

df['x_squared'] = [square(i) for i in df['x']]
df=pd.DataFrame({'x':[1,2,3,4]})

def square(x):
    return x*x

df['x_squared'] = df['x_cubed'] = None
df.loc[:, ['x_squared', 'x_cubed']] = [squareAndCube(i) for i in df['x']]
但是,我面临一个问题,实际函数返回两个项,我想将这两个项放在两个不同的新列中。我在这里编写了一个伪代码,以便更清楚地描述我的问题:

df=pd.DataFrame({'x':[1,2,3,4]})

def squareAndCube(x):
    return x*x, x*x*x

#below is a pseudo-code
df['x_squared'], df['x_cubed'] = [squareAndCube(i) for i in df['x']]
上面的代码给了我一条错误消息,说“太多的值无法解包”。
那么,我应该如何解决这个问题

你可以用矢量化的方式,就像这样-

df['x_squared'], df['x_cubed'] = df.x**2,df.x**3
df['x_squared'], df['x_cubed'] = squareAndCube(df.x)
或者使用自定义函数,就像这样-

df['x_squared'], df['x_cubed'] = df.x**2,df.x**3
df['x_squared'], df['x_cubed'] = squareAndCube(df.x)

回到你的案子,在任务的右边,你有:

In [101]: [squareAndCube(i) for i in df['x']]
Out[101]: [(1, 1), (4, 8), (9, 27), (16, 64)]
现在,在左侧,您有
df['x_平方'],df['x_立方']=
。因此,它期望所有行的平方数作为第一个输入赋值。从上面显示的列表中,第一个元素不是那个,它实际上是第一行的正方形和立方体。因此,修复方法是“转置”该列表并指定为新列。因此,解决办法是-

In [102]: L = [squareAndCube(i) for i in df['x']]

In [103]: map(list, zip(*L))  # Transposed list
Out[103]: [[1, 4, 9, 16], [1, 8, 27, 64]]

In [104]: df['x_squared'], df['x_cubed'] = map(list, zip(*L))

看在上帝的份上


像这样使用
df.loc
怎么样:

df=pd.DataFrame({'x':[1,2,3,4]})

def square(x):
    return x*x

df['x_squared'] = [square(i) for i in df['x']]
df=pd.DataFrame({'x':[1,2,3,4]})

def square(x):
    return x*x

df['x_squared'] = df['x_cubed'] = None
df.loc[:, ['x_squared', 'x_cubed']] = [squareAndCube(i) for i in df['x']]
给予

这与您所拥有的非常接近,但要使
df.loc
正常工作,这些列必须存在


对于未初始化的用户,df.loc采用两个参数,一个是您要处理的行列表(在本例中为
,表示所有行),另一个是列列表(
['x_平方','x_立方'])
,这适用于正数。思考如何概括,但这个解决方案的简洁让我分心

df = pd.DataFrame(range(1, 10))
a = np.arange(1, 4).reshape(1, -1)

np.exp(np.log(df).dot(a))

回答得很好@Divakar,+1btw广播方式1!!1比我的圆点解决方案快。这是一个非常好的答案!我使用这个
squaredcube()
函数来解决我的问题。我真正的问题是,我需要使用一个地址作为输入,并返回纬度和经度。所以最后我选择了
map
zip
方法。但是知道还有其他几种方法真的很棒!谢谢@Divakar。受此启发,添加了另一种使用广播的方法!:)@Divakar我知道你会:-)我本想请你帮忙,但却被别的事情弄得心烦意乱。