我试图弄清楚如何同时添加多个列的熊猫与熊猫。我希望在一个步骤中做到这一点,而不是重复多个步骤。

import pandas as pd

df = {'col_1': [0, 1, 2, 3],
        'col_2': [4, 5, 6, 7]}
df = pd.DataFrame(df)

df[[ 'column_new_1', 'column_new_2','column_new_3']] = [np.nan, 'dogs',3]  # I thought this would work here...

当前回答

只是想指出@Matthias Fripp回答中的选项2

(2)我并不一定期望DataFrame以这种方式工作,但它确实如此 df[[‘column_new_1’,‘column_new_2’,‘column_new_3]] = pd.DataFrame ([[np。Nan, 'dogs', 3]], index=df.index)

熊猫自己的文档中已经有记录了吗 http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics

您可以将列列表传递给[]以按此顺序选择列。 如果数据帧中不包含列,则会引发异常。 也可以通过这种方式设置多个列。 您可能会发现这对于将转换(就地)应用到列的子集很有用。

其他回答

在编写Pandas时,我的目标是编写可以链接的高效可读代码。我不会在这里解释为什么我这么喜欢链接,我在我的书《Effective Pandas》中对此进行了阐述。

我经常希望以简洁的方式添加新列,这也允许我进行链接。我的一般规则是使用.assign方法更新或创建列。

为了回答你的问题,我将使用以下代码:

(df
 .assign(column_new_1=np.nan,
         column_new_2='dogs',
         column_new_3=3
        )
)

再深入一点。我经常有一个数据框架,其中有我想要添加到我的数据框架的新列。让我们假设它看起来像…一个你想要的三列的数据框架:

df2 = pd.DataFrame({'column_new_1': np.nan,
                    'column_new_2': 'dogs',
                    'column_new_3': 3},
                   index=df.index
                  )

在这种情况下,我将编写以下代码:

(df
 .assign(**df2)
)

如果用相同的值添加很多缺失的列(a, b, c,....),这里是0,我这样做:

    new_cols = ["a", "b", "c" ] 
    df[new_cols] = pd.DataFrame([[0] * len(new_cols)], index=df.index)

这是基于公认答案的第二种变体。

只是想指出@Matthias Fripp回答中的选项2

(2)我并不一定期望DataFrame以这种方式工作,但它确实如此 df[[‘column_new_1’,‘column_new_2’,‘column_new_3]] = pd.DataFrame ([[np。Nan, 'dogs', 3]], index=df.index)

熊猫自己的文档中已经有记录了吗 http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics

您可以将列列表传递给[]以按此顺序选择列。 如果数据帧中不包含列,则会引发异常。 也可以通过这种方式设置多个列。 您可能会发现这对于将转换(就地)应用到列的子集很有用。

import pandas as pd
df = pd.DataFrame({
 'col_1': [0, 1, 2, 3], 
 'col_2': [4, 5, 6, 7]
 })
df['col_3'],  df['col_4'] =  [df.col_1]*2

>> df
col_1   col_2   col_3   col_4
0      4       0       0
1      5       1       1
2      6       2       2
3      7       3       3

使用.assign()映射字典:

这是在处理多个列时用值分配新列的最具可读性和最动态的方式。

import pandas as pd
import numpy as np

new_cols = ["column_new_1", "column_new_2", "column_new_3"]
new_vals = [np.nan, "dogs", 3]
# Map new columns as keys and new values as values
col_val_mapping = dict(zip(new_cols, new_vals))
# Unpack new column/new value pairs and assign them to the data frame
df = df.assign(**col_val_mapping)

如果你只是想把新列的值初始化为空,因为你不知道这些值会是什么,或者你有很多新列。

import pandas as pd
import numpy as np

new_cols = ["column_new_1", "column_new_2", "column_new_3"]
new_vals = [None for item in new_cols]
# Map new columns as keys and new values as values
col_val_mapping = dict(zip(new_cols, new_vals))
# Unpack new column/new value pairs and assign them to the data frame
df = df.assign(**col_val_mapping)