datetimeインデックスを持つデータフレームに対して結合/マージ/追加操作を実行します。パンダの上書きで結合またはマージする
私がdf1
を持っていて、df2
を追加したいとします。 df2
では、列数が少なくても重複していてもかまいません。インデックスが一致するすべての行について、df1
と同じ列のdf2
がある場合、df1
の値をdf2
の値で上書きします。
希望する結果を得るにはどうすればよいですか?
datetimeインデックスを持つデータフレームに対して結合/マージ/追加操作を実行します。パンダの上書きで結合またはマージする
私がdf1
を持っていて、df2
を追加したいとします。 df2
では、列数が少なくても重複していてもかまいません。インデックスが一致するすべての行について、df1
と同じ列のdf2
がある場合、df1
の値をdf2
の値で上書きします。
希望する結果を得るにはどうすればよいですか?
どのように:df2.combine_first(df1)
?それはdf2
と重ならないインデックスに対してdf1
から値を取ること
In [33]: df2
Out[33]:
A B C D
2000-01-03 0.638998 1.277361 0.193649 0.345063
2000-01-04 -0.816756 -1.711666 -1.155077 -0.678726
2000-01-05 0.435507 -0.025162 -1.112890 0.324111
2000-01-06 -0.210756 -1.027164 0.036664 0.884715
2000-01-07 -0.821631 -0.700394 -0.706505 1.193341
2000-01-10 1.015447 -0.909930 0.027548 0.258471
2000-01-11 -0.497239 -0.979071 -0.461560 0.447598
In [34]: df1
Out[34]:
A B C
2000-01-03 2.288863 0.188175 -0.040928
2000-01-04 0.159107 -0.666861 -0.551628
2000-01-05 -0.356838 -0.231036 -1.211446
2000-01-06 -0.866475 1.113018 -0.001483
2000-01-07 0.303269 0.021034 0.471715
2000-01-10 1.149815 0.686696 -1.230991
2000-01-11 -1.296118 -0.172950 -0.603887
2000-01-12 -1.034574 -0.523238 0.626968
2000-01-13 -0.193280 1.857499 -0.046383
2000-01-14 -1.043492 -0.820525 0.868685
In [35]: df2.comb
df2.combine df2.combineAdd df2.combine_first df2.combineMult
In [35]: df2.combine_first(df1)
Out[35]:
A B C D
2000-01-03 0.638998 1.277361 0.193649 0.345063
2000-01-04 -0.816756 -1.711666 -1.155077 -0.678726
2000-01-05 0.435507 -0.025162 -1.112890 0.324111
2000-01-06 -0.210756 -1.027164 0.036664 0.884715
2000-01-07 -0.821631 -0.700394 -0.706505 1.193341
2000-01-10 1.015447 -0.909930 0.027548 0.258471
2000-01-11 -0.497239 -0.979071 -0.461560 0.447598
2000-01-12 -1.034574 -0.523238 0.626968 NaN
2000-01-13 -0.193280 1.857499 -0.046383 NaN
2000-01-14 -1.043492 -0.820525 0.868685 NaN
注意。これがあなたが望むものを正確に行なわないなら、私はこの機能を改善したい/それにオプションを追加したいと思うでしょう。
このようにマージするには、DataFrameのupdate
メソッドが便利です。
documentationから例を取る:
import pandas as pd
import numpy as np
df1 = pd.DataFrame([[np.nan, 3., 5.], [-4.6, np.nan, np.nan],
[np.nan, 7., np.nan]])
df2 = pd.DataFrame([[-42.6, np.nan, -8.2], [-5., 1.6, 4]],
index=[1, 2])
データupdate
前:
>>> df1
0 1 2
0 NaN 3.0 5.0
1 -4.6 NaN NaN
2 NaN 7.0 NaN
>>>
>>> df2
0 1 2
1 -42.6 NaN -8.2
2 -5.0 1.6 4.0
レッツ・更新df1
をデータでdf2
から:
df1.update(df2)
更新後のデータ:
>>> df1
0 1 2
0 NaN 3.0 5.0
1 -42.6 NaN -8.2
2 -5.0 1.6 4.0
備考:
update
を呼び出してデータフレームを修正、これは "場所に" 操作であることに気づくことが重要です。これはdictsから知っている 'update'メソッドとまったく同じように動作するので、' combine_first'よりも直観的です。 – saroele
私はこれが本当に私が欲しいものだと思います、ありがとうございます。 – saroele
'combine_first'には問題があります - それを使用して、30k行の3つのデータフレームを結合して、すべて私のメモリを追い越します。これはどうですか? – scry
この機能がオプションの引数 'join = 'outer''(現在は' left'のみが実装されています)を持つ 'df.update'関数の一部であると、はるかに直感的です。 私の場合、 'df1'から計算された' df2'は 'df1'よりもはるかに少ない列ですが(' df1'にはないものもあります)、可能な限り計算された値で 'df1'を更新したいさらに余分な列を追加します。このため、 'df1update(df2、join = 'outer')'は 'df1 = df2.combine_first(df1)'よりもはるかに理解しやすいでしょう。 PS。これは軽微ですが、そうでなければ 'パンダ'はほとんど独占的に素晴らしいです! =) – Axel