小能豆

如何在一次分配中向pandas数据框添加多列

javascript

我正在尝试弄清楚如何使用 Pandas 同时向 pandas 添加多列。我希望一步完成此操作,而不是重复多个步骤。

import pandas as pd

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

我认为这在这里会起作用......

df[['column_new_1', 'column_new_2', 'column_new_3']] = [np.nan, 'dogs', 3]

阅读 39

收藏
2024-09-15

共1个答案

小能豆

我原本以为你的语法也能正常工作。问题出现是因为当你使用列列表语法 ( df[[new1, new2]] = ...) 创建新列时,pandas 要求右侧是 DataFrame(请注意,DataFrame 的列是否与你创建的列同名实际上并不重要)。

您的语法非常适合将标量值分配给现有列,并且 pandas 也乐于使用单列语法 ( 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]
})

然后执行以下操作之一:

1)三次赋值合一,使用迭代器解包

df['column_new_1'], df['column_new_2'], df['column_new_3'] = np.nan, 'dogs', 3

2)使用DataFrame()扩展单行来匹配索引

df[['column_new_1', 'column_new_2', 'column_new_3']] = pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)

3)使用以下方法与临时 DataFrame 结合pd.concat

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
)

4)使用以下方法与临时 DataFrame 结合.join

这与3类似,但效率可能较低。

df = df.join(pd.DataFrame(
    [[np.nan, 'dogs', 3]], 
    index=df.index, 
    columns=['column_new_1', 'column_new_2', 'column_new_3']
))

5)使用字典代替3和4中使用的列表

与前两种方法相比,这是一种更“自然”的创建临时 DataFrame 的方法。请注意,在Python 3.5 或更早版本中,新列将按字母顺序排序。

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

6)使用.assign()多列参数

这可能是 Python 3.6+ 中的赢家。但与上一个一样,在早期版本的 Python 中,新列将按字母顺序排序。

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

7)创建新列,然后一次性分配所有值

根据这个答案。这很有趣,但我不知道什么时候才值得这么麻烦。

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

8)三项独立作业

最终,这很难被打败。

df['column_new_1'] = np.nan
df['column_new_2'] = 'dogs'
df['column_new_3'] = 3
2024-09-15