いつも忘れるpandas基礎事項 ~ pandas.Dataframeの列への代入

次のようなテストコードで、dataframeであるdf1を作成し、A列~D列を用意する。
dataframeの値はnp.random.randnで適当に生成。

ここで、df1のC列とD列を書き換えることを考えるが、indexを指定したdf2の列で書き換えるのと、indexを指定しないdf3の列で書き換えるのでは書き換わり方が異なる。
indexを明確に割り当てたdataframeから列を抽出するとindexも保たれて、それに該当するdataframeの値が書き換わる。
一方、indexを割り当てていないdataframeから抽出した列で書き換えると、indexが明示されていないため書き換えられる場所はindexが小さい順となる。

    def test(self):
        matrix = np.random.randn(6, 4)
        df1 = pd.DataFrame(matrix, columns=list('ABCD'))

#この時点でのdf1
          A         B         C         D
0  0.453371 -0.761359  0.959431 -2.675909
1  0.659052  1.234831 -1.268636  1.610045
2  1.819746  0.065682  0.436914 -0.201970
3 -0.491170 -0.583853  0.820178 -0.356666
4 -0.354359 -0.434484  0.229461  0.475860
5 -0.227457  0.059744 -0.106924 -0.901803

        df2 = pd.DataFrame(
            {'A': [29, 24, 10, 5, 0]},
            columns=['A'],
            index=[0,1,2,4,5])
        df1['C'] = df2['A']

#この時点でのdf1
          A         B     C         D
0  0.453371 -0.761359  29.0 -2.675909
1  0.659052  1.234831  24.0  1.610045
2  1.819746  0.065682  10.0 -0.201970
3 -0.491170 -0.583853   NaN -0.356666
4 -0.354359 -0.434484   5.0  0.475860
5 -0.227457  0.059744   0.0 -0.901803

        df3 = pd.DataFrame(
            {'A': [29, 24, 10, 5, 0]},
            columns=['A']
            )
        df1['D'] = df3['A']

#最終的に次のように書き換わる。
          A         B     C     D
0 -0.617475 -0.315053  29.0  29.0
1 -1.252583 -0.094725  24.0  24.0
2  0.356797 -1.704311  10.0  10.0
3 -0.940906 -0.313336   NaN   5.0
4  0.880427  0.561398   5.0   0.0
5 -1.461549  0.859590   0.0   NaN