pandas.DataFrameに列や行を追加(assign, appendなど)

pandas.DataFrameに新たな列または行を追加する方法を説明します。 新規の列名・行名を指定して追加する、pandas.DataFrameのassign()メソッド、append()メソッドで追加する、などの方法があります。 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に列を追加 新規列名を指定して追加 assign()メソッドで追加・代入 concat()関数でSeries, DataFrameを横に連結

pandas.DataFrameに行を追加 新規行名を指定して追加 append()メソッドで追加 concat()関数でSeries, DataFrameを縦に連結 転置してからassign()メソッドを使用

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  0

ベクトルを追加 リストなどのベクトルの場合、そのまま代入される。

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']
print(df)
#        A   B   C  D  E     F
# ONE    0  B1  C1  0  0  B1C1
# TWO    0  B2  C2  0  1  B2C2
# THREE  0  B3  C3  0  2  B3C3

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のラベルindexがpandas.DataFrameの列名indexと一致していない場合は欠損値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

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()メソッドで追加・代入

pandas.DataFrameに新たな列を追加したり既存の列に新たな値を代入したりするためのメソッドとしてassign()が用意されています。

pandas.DataFrame.assign — pandas 0.22.0 documentation

再度オブジェクトを生成し、assign()メソッドの使い方を説明します。

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

assign()メソッドでは、キーワード引数列名=値で列名とその値を指定します。 既存の列名の場合は値が代入され、新規の列名の場合は新たな列が追加される。

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

df_new = df.assign(D=0)
print(df_new)
#         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
# THREE  A3  B3  C3

上述の例のように、リストやpandas.Seriesなども値として指定可能。複数列を一括で追加・代入できます。

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_new = df.assign(C='XXX',
                   D=0, E=[0, 1, 2],
                   F=s, G=s.values,
                   H=df['A'] + df['B'])
print(df_new)
#         A   B    C  D  E    F   G     H
# ONE    A1  B1  XXX  0  0  NaN  X2  A1B1
# TWO    A2  B2  XXX  0  1   X2  X3  A2B2
# THREE  A3  B3  XXX  0  2   X3  X4  A3B3

なお、assign()メソッドを使う場合は列名として数値を指定できないので注意。

concat()関数でSeries, DataFrameを横に連結

これまでの例ではpandas.Seriesを追加する場合、そのname属性は無視された。 pandas.concat()関数で引数axis=1として横方向に連結すると、pandas.Seriesのnameがpandas.DataFrameの列名となります。 pandas.concat()の第一引数に連結したいオブジェクトのリストやタプルを指定します。

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

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_concat = pd.concat([df, s], axis=1)
print(df_concat)
#          A    B    C    X
# FOUR   NaN  NaN  NaN   X4
# ONE     A1   B1   C1  NaN
# THREE   A3   B3   C3   X3
# TWO     A2   B2   C2   X2

引数join='inner'として共通の行名の行のみを残すことも可能。

df_concat_in = pd.concat([df, s], axis=1, join='inner')
print(df_concat_in)
#         A   B   C   X
# TWO    A2  B2  C2  X2
# THREE  A3  B3  C3  X3

複数のpandas.Seriesを連結したり、pandas.DataFrameを連結したりすることもできます。

s1 = pd.Series(['X1', 'X2', 'X3'], index=df.index, name='X')
s2 = pd.Series(['Y1', 'Y2', 'Y3'], index=df.index, name='Y')

df_concat = pd.concat([df, s1, s2], axis=1)
print(df_concat)
#         A   B   C   X   Y
# ONE    A1  B1  C1  X1  Y1
# TWO    A2  B2  C2  X2  Y2
# THREE  A3  B3  C3  X3  Y3

df2 = pd.DataFrame({'df_col1': 0, 'df_col2': range(3)}, index=df.index)
print(df2)
#        df_col1  df_col2
# ONE          0        0
# TWO          0        1
# THREE        0        2

df_concat2 = pd.concat([df, df2], axis=1)
print(df_concat2)
#         A   B   C  df_col1  df_col2
# ONE    A1  B1  C1        0        0
# TWO    A2  B2  C2        0        1
# THREE  A3  B3  C3        0        2

pandas.concat()関数についての詳細は以下の記事を参照。

pandas.DataFrameに行を追加

新規行名を指定して追加

iloc[行名]で行を選択して値を代入できます。

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

df.loc['ONE'] = 0
print(df)
#         A   B   C
# ONE     0   0   0
# TWO    A2  B2  C2
# THREE  A3  B3  C3

列の場合と同様に、ここにまだ存在しない行名を指定することで、その行を追加して値を代入することができます。 スカラーを追加 スカラーの場合、すべての要素がその値となります。

df.loc['FOUR'] = 0
print(df)
#         A   B   C
# ONE     0   0   0
# TWO    A2  B2  C2
# THREE  A3  B3  C3
# FOUR    0   0   0

ベクトルを追加 リストなどのベクトルの場合、そのまま代入される。

df.loc['FIVE'] = ['A5', 'B5', 'C5']
print(df)
#         A   B   C
# ONE     0   0   0
# TWO    A2  B2  C2
# THREE  A3  B3  C3
# FOUR    0   0   0
# FIVE   A5  B5  C5

要素数と列数が一致していないとエラー(ValueError)になる。

# df.loc['SIX'] = ['A6', 'B6']
# ValueError: cannot set a row with mismatched columns

pandas.Seriesを追加 pandas.Seriesでも問題ありません。 ラベルが一致しないときに欠損値NaNが代入されるなど、列の場合と同様に処理される。

df.loc['XXX'] = df.loc['TWO'] + df.loc['THREE']
print(df)
#           A     B     C
# ONE       0     0     0
# TWO      A2    B2    C2
# THREE    A3    B3    C3
# FOUR      0     0     0
# FIVE     A5    B5    C5
# XXX    A2A3  B2B3  C2C3

s = pd.Series(['B6', 'C6', 'D6'], index=['B', 'C', 'D'], name='SIX')
print(s)
# B    B6
# C    C6
# D    D6
# Name: SIX, dtype: object

df.loc['YYY'] = s
print(df)
#           A     B     C
# ONE       0     0     0
# TWO      A2    B2    C2
# THREE    A3    B3    C3
# FOUR      0     0     0
# FIVE     A5    B5    C5
# XXX    A2A3  B2B3  C2C3
# YYY     NaN    B6    C6

df.loc['ZZZ'] = s.values
print(df)
#           A     B     C
# ONE       0     0     0
# TWO      A2    B2    C2
# THREE    A3    B3    C3
# FOUR      0     0     0
# FIVE     A5    B5    C5
# XXX    A2A3  B2B3  C2C3
# YYY     NaN    B6    C6
# ZZZ      B6    C6    D6

append()メソッドで追加

pandas.DataFrameに新たな行を追加するために、メソッドappend()が用意されています。

pandas.DataFrame.append — pandas 0.22.0 documentation

再度オブジェクトを生成し、append()メソッドの使い方を説明します。

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.Seriesを追加する場合、元のpandas.DataFrameの列名columnsとpandas.Seriesのラベルindexが対応します。一致しない場合は欠損値NaNが代入される。 pandas.Seriesのname属性が新たな行名となります。

s = pd.Series(['A4', 'B4', 'C4'], index=df.columns, name='FOUR')
print(s)
# A    A4
# B    B4
# C    C4
# Name: FOUR, dtype: object

df_append = df.append(s)
print(df_append)
#         A   B   C
# ONE    A1  B1  C1
# TWO    A2  B2  C2
# THREE  A3  B3  C3
# FOUR   A4  B4  C4

s_mismatch = pd.Series(['B5', 'C5', 'D5'], index=['B', 'C', 'D'], name='FIVE')
print(s_mismatch)
# B    B5
# C    C5
# D    D5
# Name: FIVE, dtype: object

df_append_mismatch = df.append(s_mismatch)
print(df_append_mismatch)
#          A   B   C    D
# ONE     A1  B1  C1  NaN
# TWO     A2  B2  C2  NaN
# THREE   A3  B3  C3  NaN
# FIVE   NaN  B5  C5   D5

新たなオブジェクトが返され、元のオブジェクトは変更されない。

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

pandas.Seriesにname属性が設定されていないとエラー(TypeError)となり追加できないので注意。

s_no_name = pd.Series(['B4', 'C4', 'D4'], index=['B', 'C', 'D'])

# df_append_no_name = df.append(s_no_name)
# TypeError: Can only append a Series if ignore_index=True or if the Series has a name

第一引数にリストやタプルを指定すると、複数のオブジェクトを追加できます。

df_append_multi = df.append([s, s_mismatch])
print(df_append_multi)
#          A   B   C    D
# ONE     A1  B1  C1  NaN
# TWO     A2  B2  C2  NaN
# THREE   A3  B3  C3  NaN
# FOUR    A4  B4  C4  NaN
# FIVE   NaN  B5  C5   D5

pandas.DataFrameも指定できます。

df2 = pd.DataFrame([['B4', 'C4', 'D4'], ['B5', 'C5', 'D5']],
                   index=['FOUR', 'FIVE'], columns=['B', 'C', 'D'])
print(df2)
#        B   C   D
# FOUR  B4  C4  D4
# FIVE  B5  C5  D5

df_append = df.append(df2)
print(df_append)
#          A   B   C    D
# ONE     A1  B1  C1  NaN
# TWO     A2  B2  C2  NaN
# THREE   A3  B3  C3  NaN
# FOUR   NaN  B4  C4   D4
# FIVE   NaN  B5  C5   D5

concat()関数でSeries, DataFrameを縦に連結

append()メソッドと同様にpandas.DataFrame同士の連結はpandas.concat()関数でも可能。 pandas.concat()の第一引数に連結したいオブジェクトのリストやタプルを指定します。デフォルトで縦方向に連結される。

df_concat = pd.concat([df, df2])
print(df_concat)
#          A   B   C    D
# ONE     A1  B1  C1  NaN
# TWO     A2  B2  C2  NaN
# THREE   A3  B3  C3  NaN
# FOUR   NaN  B4  C4   D4
# FIVE   NaN  B5  C5   D5

引数join='inner'として共通の列名の列のみを残すことも可能。

df_concat_in = pd.concat([df, df2], join='inner')
print(df_concat_in)
#         B   C
# ONE    B1  C1
# TWO    B2  C2
# THREE  B3  C3
# FOUR   B4  C4
# FIVE   B5  C5

pandas.DataFrameとpandas.Seriesの縦方向の連結は注意が必要。 append()メソッドを使うと以下のように追加される。

s = pd.Series(['AX', 'BX', 'CX'], index=df.columns, name='X')
print(s)
# A    AX
# B    BX
# C    CX
# Name: X, dtype: object

df_append_s = df.append(s)
print(df_append_s)
#         A   B   C
# ONE    A1  B1  C1
# TWO    A2  B2  C2
# THREE  A3  B3  C3
# X      AX  BX  CX

pandas.concat()関数の場合は以下のようになる。

df_concat_s = pd.concat([df, s])
print(df_concat_s)
#          A    B    C    0
# ONE     A1   B1   C1  NaN
# TWO     A2   B2   C2  NaN
# THREE   A3   B3   C3  NaN
# A      NaN  NaN  NaN   AX
# B      NaN  NaN  NaN   BX
# C      NaN  NaN  NaN   CX

pandas.Seriesからpandas.DataFrameを生成しさらに転置すればpandas.concat()で連結できるが、append()メソッドを使うほうが素直。

st = pd.DataFrame(s).T
print(type(st))
print(st)
# <class 'pandas.core.frame.DataFrame'>
#     A   B   C
# X  AX  BX  CX

df_concat_st = pd.concat([df, pd.DataFrame(s).T])
print(df_concat_st)
#         A   B   C
# ONE    A1  B1  C1
# TWO    A2  B2  C2
# THREE  A3  B3  C3
# X      AX  BX  CX

pandas.concat()関数についての詳細は以下の記事を参照。

転置してからassign()メソッドを使用

行の追加にもassign()メソッドを使用したい場合は、pandas.DataFrameを転置してからassign()メソッドを使用し、さらに転置してもとに戻すという方法も可能。

df_assign = df.T.assign(FOUR=0, FIVE=['A5', 'B5', 'C5']).T
print(df_assign)
#         A   B   C
# ONE    A1  B1  C1
# TWO    A2  B2  C2
# THREE  A3  B3  C3
# FOUR    0   0   0
# FIVE   A5  B5  C5

シェア

関連カテゴリー

Python pandas

pandas.DataFrame, Seriesを時系列データとして処理 pandasでcsv/tsvファイル読み込み(read_csv, read_table) pandas.DataFrameの行を条件で抽出するquery pandasでカテゴリ変数をダミー変数に変換(get_dummies) pandasでクリップボードの中身をDataFrameとして取得するread_clipboard pandasで欠損値NaNが含まれているか判定、個数をカウント pandas.DataFrameのforループ処理(イテレーション) pandas.Seriesのインデックスと値を入れ替え(スワップ) pandasの時系列データのタイムゾーンを処理(tz_convert, tz_localize) pandas.DataFrameをGroupByでグルーピングし統計量を算出 pandas参考書『Pythonによるデータ分析入門』の注意点 pandasで欠損値NaNを前後の値から補間するinterpolate pandasで条件に応じて値を代入(where, mask) pandas.DataFrameの構造とその作成方法 Python, pandasでwebページの表(htmlのtable)をスクレイピング

Last Updated: 6/26/2019, 10:34:03 PM