pandas.DataFrameに列を追加(assign, contact)

import pandas as pd
import numpy as np
In [2]:
%%html
<style>
table {float:left}
td {text-align:left}
</style>
 
 

列名を指定して追加

In [3]:
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
In [4]:
df['new column'] = [1, 2, 3]
print(df)
 
        A   B   C  new column
ONE    A1  B1  C1           1
TWO    A2  B2  C2           2
THREE  A3  B3  C3           3
 

DataFrame.assign

メソッド 引数 説明
DataFrame.assign (**kwargs) Assign new columns to a DataFrame, returning a new object (a copy) with the new columns added to the original ones.
 

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

pandas.DataFrame.assign — pandas 0.22.0 documentation

 

assign()メソッドでは、キーワード引数列名=値で列名とその値を指定する。

既存の列名の場合は値が代入され、新規の列名の場合は新たな列が追加される。

注意:いずれも新たなオブジェクトが返され、元のオブジェクトは変更されない

In [5]:
df_new = df.assign(A=0)
print(df_new)
 
       A   B   C  new column
ONE    0  B1  C1           1
TWO    0  B2  C2           2
THREE  0  B3  C3           3
In [6]:
df_new = df.assign(D=0)
print(df_new)
 
        A   B   C  new column  D
ONE    A1  B1  C1           1  0
TWO    A2  B2  C2           2  0
THREE  A3  B3  C3           3  0
 

リストやpandas.Seriesなども値として指定可能。複数列を一括で追加・代入できる。(name属性は無視)

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

In [7]:
s = pd.Series(['X2', 'X3', 'X4'], index=['TWO', 'THREE', 'FOUR'], name='X')
print(s)
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)
 
TWO      X2
THREE    X3
FOUR     X4
Name: X, dtype: object
        A   B    C  new column  D  E    F   G     H
ONE    A1  B1  XXX           1  0  0  NaN  X2  A1B1
TWO    A2  B2  XXX           2  0  1   X2  X3  A2B2
THREE  A3  B3  XXX           3  0  2   X3  X4  A3B3
 

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

pandas.concat()関数で引数axis=1として横方向に連結すると、pandas.Seriesのnameがpandas.DataFrameの列名となる。

pandas.concat()の第一引数に連結したいオブジェクトのリストやタプルを指定する。

In [8]:
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
In [9]:
s = pd.Series(['X2', 'X3', 'X4'], index=['TWO', 'THREE', 'FOUR'], name='X')
print(s)
df_concat = pd.concat([df, s], axis=1, sort=True)
print(df_concat)
 
TWO      X2
THREE    X3
FOUR     X4
Name: X, dtype: object
         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'として共通の行名の行のみを残すことも可能。
In [10]:
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を連結したりすることもできる。
In [11]:
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
In [12]:
df2 = pd.DataFrame({'df_col1': 0, 'df_col2': range(3)}, index=df.index)
print(df2)
df_concat2 = pd.concat([df, df2], axis=1)
print(df_concat2)
 
       df_col1  df_col2
ONE          0        0
TWO          0        1
THREE        0        2
        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
In [ ]: