为 Pandas 中的多列赋值[重复]
Posted
技术标签:
【中文标题】为 Pandas 中的多列赋值[重复]【英文标题】:Assign values to multiple columns in Pandas [duplicate] 【发布时间】:2016-03-08 13:53:09 【问题描述】:我已经关注了简单的 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
【问题讨论】:
pandas.pydata.org/pandas-docs/stable/10min.html 你看过文档了吗?如何创建数据框非常清楚。df['col2', 'col3'] = [2,3]
可以正常工作。 (在所有行都相同的情况下)
【参考方案1】:
也可以使用assign
df.assign(col2 = 2, col3= 3)
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.assign.html
【讨论】:
【参考方案2】:我在尝试将多个标量值应用于多个新列时遇到了这个问题,但找不到更好的方法。如果我遗漏了一些明显的东西,请告诉我,但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)
【讨论】:
【参考方案3】:有一种方便的解决方案可以通过元组列表将多个系列连接到数据帧。您可以从您的元组列表中构造一个数据框之前分配:
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
这很方便,例如,当您希望加入任意数量的系列时。
【讨论】:
迄今为止最好的解决方案!特别是当你有一个 numpy 数组时。【参考方案4】:看起来解决方案很简单:
df['col2'], df['col3'] = zip(*[(2,3), (2,3), (2,3)])
【讨论】:
虽然这段代码可以回答这个问题,但最好包含一些上下文,解释它是如何工作的以及何时使用它。从长远来看,纯代码的答案没有用处。 如果您的问题很简单,解决方案也很简单。如果您想同时分配 100 列,则解决方案是无用的。 如果您有分配 100 列的优化解决方案,请随时分享。 @SpanishBoy 有点令人沮丧,这么多年过去了,仍然没有方便的语法。你能做的最好的就是一个 for 循环:for colname, data in zip(['col2', 'col3'], zip(*[(2, 3), (2, 3), (2, 3)])): df[colname] = data
@shadowtalker,我认为有更好的方法来做到这一点..您可以将数据框分配给df[['col2', 'col3']]
,请参阅我的答案。以上是关于为 Pandas 中的多列赋值[重复]的主要内容,如果未能解决你的问题,请参考以下文章