当前位置: 首页 > 知识库问答 >
问题:

如何在一次作业中向熊猫数据帧添加多个列?

李飞翼
2023-03-14

我对熊猫很陌生,我想知道如何同时给熊猫添加多个列。感谢您的帮助。理想情况下,我想一步到位,而不是多步重复。。。

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]  #thought this would work here...

共有3个答案

洪雅健
2023-03-14

我在编写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)
)
杨轶
2023-03-14

您可以对列名和值的字典使用< code>assign。

In [1069]: df.assign(**{'col_new_1': np.nan, 'col2_new_2': 'dogs', 'col3_new_3': 3})
Out[1069]:
   col_1  col_2 col2_new_2  col3_new_3  col_new_1
0      0      4       dogs           3        NaN
1      1      5       dogs           3        NaN
2      2      6       dogs           3        NaN
3      3      7       dogs           3        NaN
单昊穹
2023-03-14

我本希望你的语法也能起作用。出现问题的原因是,当您使用列列表语法(df[[new1,new2]]=…)创建新列时,panda要求右侧是DataFrame(请注意,如果DataFrame的列与您创建的列具有相同的名称,实际上并不重要)。

您的语法可以很好地将标量值分配给现有列,熊猫也很乐意使用单列语法(df[new1]=…)将标量值分配给新列。因此,解决方案要么将其转换为多个单列分配,要么为右侧创建一个合适的DataFrame。

以下是几种可行的方法:

import pandas as pd
import numpy as np

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

然后执行以下操作之一:

df['column_new_1'], df['column_new_2'], df['column_new_3'] = [np.nan, 'dogs', 3]
df[['column_new_1', 'column_new_2', 'column_new_3']] = pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)
df = pd.concat(
    [
        df,
        pd.DataFrame(
            [[np.nan, 'dogs', 3]], 
            index=df.index, 
            columns=['column_new_1', 'column_new_2', 'column_new_3']
        )
    ], axis=1
)
df = df.join(pd.DataFrame(
    [[np.nan, 'dogs', 3]], 
    index=df.index, 
    columns=['column_new_1', 'column_new_2', 'column_new_3']
))
df = df.join(pd.DataFrame(
    {
        'column_new_1': np.nan,
        'column_new_2': 'dogs',
        'column_new_3': 3
    }, index=df.index
))

我非常喜欢@zero答案的这个变体,但与前一个一样,新列总是按字母顺序排序,至少在早期版本的Python中是这样的:

df = df.assign(column_new_1=np.nan, column_new_2='dogs', column_new_3=3)
new_cols = ['column_new_1', 'column_new_2', 'column_new_3']
new_vals = [np.nan, 'dogs', 3]
df = df.reindex(columns=df.columns.tolist() + new_cols)   # add empty cols
df[new_cols] = new_vals  # multi-column assignment works for existing cols
df['column_new_1'] = np.nan
df['column_new_2'] = 'dogs'
df['column_new_3'] = 3

注意:这些选项中的许多已经在其他答案中涵盖:将多列添加到DataFrame并将它们设置为等于现有列,是否可以一次添加多列到熊猫DataFrame?,将多个空列添加到熊猫DataFrame

 类似资料:
  • 我经常处理格式不好的数据(即数字字段不一致等) 可能还有其他方法,我不知道,但我格式化数据帧中单个列的方法是使用函数并将该列映射到该函数。 问题:1-如果我有一个包含50列的数据框,并且想要将该格式应用于多个列,等等列1, 3, 5, 7, 9, 你能去吗 ...这样我可以格式化所有的数字列在一行?

  • 我有一个csv文件列表,我使用 我目前正在尝试遍历csv列表,并使用方法将axis参数设置为1,以按列将所有数据帧添加到一起。 它是工作的希望,但我遇到的问题,因为所有的数据帧都有相同的冒号名称,当我连接他们我得到例如10列都与关键"日期" 不管怎样,我能给哥伦布起个独一无二的名字吗?比如伦敦约会,柏林约会?显然,这些名称基于数据帧的名称。

  • 我正在与以下df合作: 我想强制所有年份的数字: 有没有一个简单的方法来做这件事,还是我必须把它们全部打印出来?

  • 问题内容: 我有两个,都被索引。我需要将元素添加在一起以形成一个new ,但前提是索引和列相同。如果该项不存在于之一,则应将其视为零。 我试过使用,但这无论索引和列如何。还尝试了一个简单的方法,但是如果两个数据框都没有该元素,则给出a 。 有什么建议? 问题答案: 怎么样

  • 我正在尝试连接到数据帧。它们看起来像这样 期望的最终目标是: 我一直试图使用pd.merge和。连接函数与on='外'设置不成功

  • 我正在尝试在我的列表中显示在EditText中收集的3个数据。在执行按钮时。如果有3个字段要添加,它们将单独存储给我。我可以在我的代码中做些什么来使其统一为列表中的单个字段?示例:姓名:薛西斯年龄:14描述罪行:当我离开学校时,他朝我吐口水。 当您点击保存按钮时: 你所期待的Jorge 14当我离开学校时,他向我吐口水(列表中的一行)现在发生的事情Jorge 14当我离开学校时,他向我吐口水。(列