質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
マージ

複数のデータベースやファイル、プログラムなどを決まった手順や規則に従って一つに結合すること。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1159閲覧

Pythonで2つの大量のデーターフレームを高速にマージさせていきたい。

pritu

総合スコア7

マージ

複数のデータベースやファイル、プログラムなどを決まった手順や規則に従って一つに結合すること。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/08/04 10:26

google colaboratoryの環境下で2つのデーターフレームをマージさせていますが、
あまりにも処理が遅くて困っております。
1600くらいなら気にならない速さなのですが、
一つのカラムをマージさせるのに36万行だと1時間ほどかかっています。
これだと大量のカラムをマージさせるの時間がかかってしまいますので、
知恵を貸していただきたく質問投稿しました。

【元となるデーターフレーム】
・36万行ほど。
・インデックスは日付。

【マージさせるデーターフレーム】
・インデックスは日付。
・元となるデーターフレームとは要素のインデックス数が少ない。

自分が考えたコードは以下になります。

Python

1#データーフレームの数 2N = len(df) 3N1 = len(df1) 4 5#空のNumpty配列を準備。 6r = np.arange(N).reshape((-1,1)) 7df['カラム'] = np.arange(N).reshape((-1,1)) 8#データがない箇所はNaN。 9df['カラム] = 'NaN' 10 11for i in range(0,N1): 12 mon = df1.index[i].month 13 day = df1.index[i].day 14 hor = df1.index[i].hour 15 minut = df1.index[i].minute 16 kalum = df1['カラム'][i] 17 for i1 in range(0,N): 18 if df.index[i1].month >= mon and df.index[i1].day >= day and 19 df.index[i1].hour >= hor and df.index[i1].minute: 20 df['カラム'][i1:N] = kalum

このコードだと1時間ほどかかり、
スタートする日付(変化)から最後の行まで代入というのを繰り返しているので、
2度手間で処理が遅いのかなと思っております。

もっとスマートで計算処理が早い方法がありましたら、
ご教授よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2021/08/04 11:23

dfとはpandas.DataFrameのことですよね?pandasの機能でマージ出来ないデータ構造なのでしょうか?
bsdfan

2021/08/04 11:29 編集

日付データを、month, day, hour, minuteで別々に比較する理由はありますか? 年と秒は無視したいとか?
pritu

2021/08/04 12:36

meg_さん。 はい、dfは、pandas.DataFrameのことです。言葉足らずですいません。 ちなみに、csvファイルから読み込んだデータフレームです。 pandasの機能で、pandas.mergeというのがありますが、データーフレームのインデックス数?が同じ数じゃないとできなかったんですよね。
meg_

2021/08/04 12:42 編集

> pandasの機能で、pandas.mergeというのがありますが、データーフレームのインデックス数?が同じ数じゃないとできなかったんですよね。 何かエラーが出たのでしょうか? ppaulさんの回答ではマージ出来ませんか?
pritu

2021/08/04 12:42

bsdfanさん。 年ごとにcsvファイルがありまして、 年は比較しなくていいかなと思い比較していません。 比較しても処理速度変わらないと思うのでつけてもいいとは思いますが、つけてないだけですね! 2つのデーターフレームの同じ日付のインデックスを合わせて1つのカラムをつけ足していきたいんですよね。 データーフレームに欠損値もあるのでどうするほうがスマートかわからなく・・・。
pritu

2021/08/04 12:51

他の追加したいデータに、 例えば、 1月1日 0.8 3月8日 0.5 というデータがあって、 1つのデータに1月1日~3月7日まで同じ0.8の値を代入して、3月8日~〇月〇日まで、0.5の値を代入したい「カラム」があったりもします。
pritu

2021/08/04 13:09

> pandasの機能で、pandas.mergeというのがありますが、データーフレームのインデックス数?が同じ数じゃないとできなかったんですよね。 何かエラーが出たのでしょうか? >マージを実行する共通の列がありません。とエラーが出てました。
meg_

2021/08/04 13:19

>>マージを実行する共通の列がありません。とエラーが出てました。 コードや実際のエラーメッセージがないので何とも言えませんね。 pandasに対してループ処理はよほどのことがない限りしないかと思います。サンプルデータを提示いただくことが解決への近道かと思います。
bsdfan

2021/08/04 13:59

解決済みになりましたが、 df = pd.merge_asof(df, df1, left_index=True, right_index=True) でもできると思います。
guest

回答1

0

ベストアンサー

求められている結果を理解できているかどうかは自信がありませんが、以下のような感じでしょうか。

python

1>>> print(df) 2 A B 32018-12-13 08:25:00 a0 b50 42018-12-13 10:50:00 a1 b100 52018-12-14 13:12:00 a3 b128 62018-12-16 06:37:00 a6 b38 72018-12-20 19:10:00 a2 b100 82018-12-25 09:35:00 a8 b32 9>>> print(df1) 10 カラム 112018-12-13 10:00:00 abc 122018-12-15 12:00:00 xyz 132018-12-20 19:10:00 pqr 14>>> df['is_df'] = True 15>>> df2 = pd.merge(df, df1, left_index=True, right_index=True, how='outer') 16>>> df2['カラム'] = df2['カラム'].fillna(method='ffill') 17>>> df3 = df2[df2['is_df']==True].drop('is_df', axis=1) 18>>> print(df3) 19 A B カラム 202018-12-13 08:25:00 a0 b50 NaN 212018-12-13 10:50:00 a1 b100 abc 222018-12-14 13:12:00 a3 b128 abc 232018-12-16 06:37:00 a6 b38 xyz 242018-12-20 19:10:00 a2 b100 pqr 252018-12-25 09:35:00 a8 b32 pqr

違っているなら、入力例(画像ではなく機械可読なもの)と求める結果を問題に追加してください。

投稿2021/08/04 11:38

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pritu

2021/08/04 13:32

ご回答ありがとうございます! 今回答ついていること気づきました。すいません、、 まさに私が求めている答えです! 本当に助かりました!本当にありがとうございますm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問