如何遍历数据框中的一列并同时更新两个新列?

3

我了解我可以向数据帧中添加一列,并将其值更新为从函数返回的值,就像这样:

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 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']]

上面的代码给了我一个错误信息,说“要解包的值太多”。 那么,我应该如何修复它?
3个回答

3

你可以以向量化的方式完成,就像这样 -

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_squared'], df['x_cubed'] =。因此,它期望所有行的平方数作为第一个输入赋值。从上面显示的列表中,第一个元素不是那个,而是第一行的平方和立方。因此,修复方法是“转置”该列表并分配为新列。因此,修复方法是 -

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))

为了NumPy广播的爱!

df['x_squared'], df['x_cubed'] = (df.x.values[:,None]**[2,3]).T

很棒的回答@Divakar,+1 - piRSquared
顺便说一下,广播比我的log_dot解决方案快得多!!1 - piRSquared
这是一个非常好的答案!我使用了squareAndCube()函数来简化我的问题。我的真正问题是需要使用地址作为输入并返回纬度和经度。最终我选择了mapzip方法。但是知道还有其他几种方法真的很棒!谢谢@Divakar。 - user3768495

1

这适用于正数。正在考虑如何推广,但这种解决方案的简洁性让我分心。

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

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

enter image description here


受此启发,我使用广播添加了另一种方法! :) - Divakar
@Divakar 我知道你会的 :-) 我本来想向你寻求帮助,但被其他事情分心了。 - piRSquared

0

使用df.loc这样怎么样:

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']]

提供

   x  x_squared  x_cubed
0  1          1        1
1  2          4        8
2  3          9       27
3  4         16       64

这很接近你的需求,但是为了让df.loc正常工作,必须确保列存在。

对于初学者而言,df.loc需要两个参数:要处理的行的列表-在本例中是:,表示所有行,以及列的列表-['x_squared','x_cubed']


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接