LoginSignup
1
0

More than 1 year has passed since last update.

Python DataFrameを縦方向に結合

Posted at

DataFrameを縦方向に結合

日々のデータを一定期間ごとにcsvで取得し、結合する場合を想定しています。
csvファイルをDataFrame.read_csvで取得し結合するときとかに使えると思います。

csvファイルをDataFrame.read_csvで取得した結果がdf1、df2、df3を想定しています。
(df3はタイトル行に項目が増えている状態です)

import pandas as pd
df1 = pd.DataFrame([['2022/1/4', '500', '400', '40'],
                    ['2022/1/5', '1000', '800', '80'],
                    ['2022/1/6', '3000', '2400', '240']],
                   columns=['date', 'value', 'cost', 'tax'])
df1['date'] = pd.to_datetime(df1['date']).dt.date
df2 = pd.DataFrame([['2022/1/6', '3000', '2400', '240'],
                    ['2022/1/7', '1000', '800', '80'],
                    ['2022/1/8', '3000', '2400', '240'],
                    ['2022/1/9', '1500', '1200', '120']],
                   columns=['date', 'value', 'cost', 'tax'])
df2['date'] = pd.to_datetime(df2['date']).dt.date
df3 = pd.DataFrame([['2022/1/9', '1500', '1200', '120', 'NaN'],
                    ['2022/1/10', '500', '400', '40', '5'],
                    ['2022/1/11', '1000', '800', '80', '10']],
                   columns=['date', 'value', 'cost', 'tax', 'tax2'])
df3['date'] = pd.to_datetime(df3['date']).dt.date

df1、df2、df3をconcatで結合します。concatだと、columnsが同じの場合はそのまま結合されます。
( ignore_index=Trueを入れることでインデックスをつけなおします。 )

df = pd.concat([df1, df2, df3], ignore_index=True)
df
date value cost tax tax2
0 2022-01-04 500 400 40 NaN
1 2022-01-05 1000 800 80 NaN
2 2022-01-06 3000 2400 240 NaN
3 2022-01-06 3000 2400 240 NaN
4 2022-01-07 1000 800 80 NaN
5 2022-01-08 3000 2400 240 NaN
6 2022-01-09 1500 1200 120 NaN
7 2022-01-09 1500 1200 120 NaN
8 2022-01-10 500 400 40 5
9 2022-01-11 1000 800 80 10

appendでも同じことができます。複数を同時に結合する場合はcancatのほうが良いかもしれませんが、for文などを使って結合する場合はappendが良いと思います。
( ignore_index=Trueを入れることでインデックスをつけなおします。 )

df = pd.DataFrame()
for d in [df1, df2, df3]:
    df = df.append(d, ignore_index=True)
df
date value cost tax tax2
0 2022-01-04 500 400 40 NaN
1 2022-01-05 1000 800 80 NaN
2 2022-01-06 3000 2400 240 NaN
3 2022-01-06 3000 2400 240 NaN
4 2022-01-07 1000 800 80 NaN
5 2022-01-08 3000 2400 240 NaN
6 2022-01-09 1500 1200 120 NaN
7 2022-01-09 1500 1200 120 NaN
8 2022-01-10 500 400 40 5
9 2022-01-11 1000 800 80 10

mergeでもkeyがわかっていれば使えますが、変わる場合は決めたエラーとなる場合があるので、注意が必要です。
df1、df2はcolumnsが一致しているが、df3は異なる。df3のcolumnsをkeyにすると'tax2'がdf1、df2に含まれていないため、エラーとなる。
meargeの場合は外部結合how=outerを設定する。重複行の削除も一度にできるメリットはあります。

key = list(df1.keys())
df = pd.DataFrame([], columns=key)
for d in [df1, df2, df3]:
    df = df.merge(d, on=key, how='outer')
df
date value cost tax tax2
0 2022-01-04 500 400 40 NaN
1 2022-01-05 1000 800 80 NaN
2 2022-01-06 3000 2400 240 NaN
3 2022-01-07 1000 800 80 NaN
4 2022-01-08 3000 2400 240 NaN
5 2022-01-09 1500 1200 120 NaN
6 2022-01-10 500 400 40 5
7 2022-01-11 1000 800 80 10

concatappendで結合した場合は、drop_duplicatesで重複の削除ができる

df = pd.concat([df1, df2, df3], ignore_index=True)
df.drop_duplicates(subset='date', keep='last')
date value cost tax tax2
0 2022-01-04 500 400 40 NaN
1 2022-01-05 1000 800 80 NaN
3 2022-01-06 3000 2400 240 NaN
4 2022-01-07 1000 800 80 NaN
5 2022-01-08 3000 2400 240 NaN
7 2022-01-09 1500 1200 120 NaN
8 2022-01-10 500 400 40 5
9 2022-01-11 1000 800 80 10
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0