Pandas中如何给多列赋值

16

我有一个简单的DataFrame - df

   0
0  1
1  2
2  3

当我试图创建新的列并为它们分配一些值时,例如下面的示例:

df['col2', 'col3'] = [(2,3), (2,3), (2,3)]

我得到了以下结构

   0 (col2, col3)
0  1    (2, 3)
1  2    (2, 3)
2  3    (2, 3)

然而,我正在寻找一种方法来到达这里:
   0 col2, col3
0  1    2,   3
1  2    2,   3
2  3    2,   3

1
你看过文档了吗?http://pandas.pydata.org/pandas-docs/stable/10min.html 它非常清楚地说明了如何创建数据帧。 - Woody Pride
如果所有行都相同,df['col2', 'col3'] = [2,3] 将正常工作。 - smci
4个回答

23

看起来解决方案很简单:

df['col2'], df['col3'] = zip(*[(2,3), (2,3), (2,3)])

6
虽然这段代码可能回答了问题,但最好加入一些上下文,解释它是如何工作的以及何时使用它。仅有代码的答案从长远来看并不实用。 - Bono
2
如果你的问题很简单,那么解决方案也很简单。但如果你想同时分配100列,那么这个解决方案就毫无用处了。 - dreab
2
如果您有针对分配100列的优化解决方案,请随时分享。 - SpanishBoy
1
@SpanishBoy 有点令人沮丧的是,这么多年过去了,仍然没有方便的语法来处理这个问题。你能做的最好的方法就是使用for循环:for colname, data in zip(['col2', 'col3'], zip(*[(2, 3), (2, 3), (2, 3)])): df[colname] = data - shadowtalker
3
@shadowtalker,我 认为 有更好的方法来完成这个任务...你可以将一个数据帧分配给 df[['col2', 'col3']],请看我的答案。 - jpp

18

通过一个元组列表方便地将多个系列加入到数据帧中有一个方便的解决方案。您可以在赋值之前从元组列表构造一个数据帧。

df = pd.DataFrame({0: [1, 2, 3]})
df[['col2', 'col3']] = pd.DataFrame([(2,3), (2,3), (2,3)])

print(df)

   0  col2  col3
0  1     2     3
1  2     2     3
2  3     2     3

举个例子,当你想要连接任意数量的系列时,这是非常方便的。


2
到目前为止最好的解决方案!特别是当你有一个numpy数组时。 - Louis Yang

7

3

当我尝试将多个标量值应用于多个新列时,遇到了这个问题,并且找不到更好的方法。如果我错过了什么明显的东西,请告诉我,但是df[['b','c']] = 0无法工作。以下是简化的代码:

# Create the "current" dataframe
df = pd.DataFrame({'a':[1,2]})

# List of columns I want to add
col_list = ['b','c']

# Quickly create key : scalar value dictionary
scalar_dict = { c : 0 for c in col_list }

# Create the dataframe for those columns - key here is setting the index = df.index
df[col_list] = pd.DataFrame(scalar_dict, index = df.index)

或者,更快的方法似乎是使用 .assign()

df = df.assign(**scalar_dict)

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