49_Pandas.DataFrame添加列和行(分配、追加等)

49_Pandas.DataFrame添加列和行(分配、追加等)

如何向 pandas.DataFrame 添加新的列或行。

通过指定新的列名/行名来添加,或者用pandas.DataFrame的assign()、insert()、append()方法添加等方法。

这里,将描述以下内容。

  • 将列添加到 pandas.DataFrame
    • 通过指定新列名添加
    • 用assign()方法添加/分配
    • 用insert()方法添加到任意位置
    • 使用 concat() 函数水平连接 Series 和 DataFrame
  • 向pandas.DataFrame 添加一行
    • 通过指定新行名称添加
    • 用append()方法添加
    • 使用 concat() 函数垂直连接 Series 和 DataFrame
    • 转置然后使用assign()、insert()方法

简要介绍连接 pandas.DataFrame 和 pandas.Series 的 pandas.concat() 函数,但有关详细信息,请参阅以下文章。

例如,创建并使用以下对象。

import pandas as pd

df = pd.DataFrame({ 'A': ['A1', 'A2', 'A3'],
                   'B': ['B1', 'B2', 'B3'],
                   'C': ['C1', 'C2', 'C3']},
                  index=['ONE', 'TWO', 'THREE'])
print(df)
# A B C
# ONE A1 B1 C1
# TWO A2 B2 C2
# THREE A3 B3 C3

将列添加到 pandas.DataFrame

通过指定新列名添加

可以在[列名]中选择一列并赋值。

df['A'] = 0
print(df)
# A B C
# ONE 0 B1 C1
# TWO 0 B2 C2
# THREE 0 B3 C3

通过指定此处尚不存在的列名称,可以添加该列并分配值。 添加标量 对于标量值,所有元素都是它们的值。

df['D'] = 0
print(df)
# A B C D
# ONE 0 B1 C1 0
# TWO 0 B2 C2 0
# THREE 0 B3 C3 0b

添加类似数组的对象 在所谓的类数组对象(例如列表和 NumPy 数组 ndarray)的情况下,每个元素都按原样分配。

df['E'] = [0, 1, 2]
print(df)
# A B C D E
# ONE 0 B1 C1 0 0
# TWO 0 B2 C2 0 1
# THREE 0 B3 C3 0 2

如果要添加的列表等元素数量与行数不匹配,则会发生错误(ValueError)。

# df['F'] = [0, 1, 2, 3]
# ValueError: Length of values does not match length of index

添加了 pandas.Series 也可以使用 pandas.Series。 如果引用pandas.DataFrame的每一列,都会被当作pandas.Series处理,所以可以将这些操作的结果和方法处理的结果作为一个新的列进行添加。

df['F'] = df['B'] + df['C']
df['G'] = df['B'].str.lower()
print(df)
# A B C D E F G
# ONE 0 B1 C1 0 0 B1C1 b1
# TWO 0 B2 C2 0 1 B2C2 b2
# THREE 0 B3 C3 0 2 B3C3 b3

如果pandas.Series的标签索引与pandas.DataFrame的列名索引不匹配,则赋值为缺失值NaN。

s = pd.Series(['X2', 'X3', 'X4'], index=['TWO', 'THREE', 'FOUR'], name='X')
print(s)
# TWO X2
# THREE X3
# FOUR X4
# Name: X, dtype: object

df['H'] = s
print(df)
# A B C D E F G H
# ONE 0 B1 C1 0 0 B1C1 b1 NaN
# TWO 0 B2 C2 0 1 B2C2 b2 X2
# THREE 0 B3 C3 0 2 B3C3 b3 X3

如果你拿到带有pandas.Series的values属性的NumPy数组numpy.ndarray并赋值,不管索引如何,元素都会按顺序赋值。在这种情况下,如果元素数与行数不匹配,则会发生错误。

print(s.values)
# ['X2' 'X3' 'X4']

df['I'] = s.values
print(df)
# A B C D E F G H I
# ONE 0 B1 C1 0 0 B1C1 b1 NaN X2
# TWO 0 B2 C2 0 1 B2C2 b2 X2 X3
# THREE 0 B3 C3 0 2 B3C3 b3 X3 X4

用assign()方法添加/分配

Assign() 是作为向pandas.DataFrame 添加新列或为现有列分配新值的方法提供的。
在assign()方法中,用关键字参数column name = value指定列名及其值。 如果是现有列名,则赋值,如果是新列名,则添加新列。

df = pd.DataFrame({ 'A': ['A1', 'A2', 'A3'],
                   'B': ['B1', 'B2', 'B3'],
                   'C': ['C1', 'C2', 'C3']},
                  index=['ONE', 'TWO', 'THREE'])

print(df.assign(A=0))
# A B C
# ONE 0 B1 C1
# TWO 0 B2 C2
# THREE 0 B3 C3

print(df.assign(D=0))
# A B C D
# ONE A1 B1 C1 0
# TWO A2 B2 C2 0
# THREE A3 B3 C3 0

返回一个新对象,原始对象不变。

print(df)
# A B C
# ONE A1 B1 C1
# TWO A2 B2 C2

点赞