2012-06-19 16 views
29

私はdataframesの2つを持っていて、いずれもtimeseriesでインデックスされています。インデックスと列が同じ場合にのみ、要素をまとめて新しいdataframeを作成する必要があります。アイテムがdataframeのいずれかに存在しない場合は、ゼロとして扱う必要があります。パンダのデータフレームを2つ追加する

私は.addを使用しようとしましたが、この合計はインデックスと列に関係なくあります。 combined_data = dataframe1 + dataframe2でも簡単に試しましたが、両方のデータフレームに要素がない場合はNaNとなります。

提案がありますか?

+0

fill_value使用するアイテムは、1つのまたは両方のデータフレームに存在しない場合は、あなたが起こるしたいものを明確にすることはできますか?そのアイテムが* one * dataframeに存在しない場合は、ゼロとして扱うべきです---そのデータフレームの値をゼロとして扱い、他のデータフレームの値に追加するかどうか結果のデータフレームの値はゼロでなければなりませんか?また、 'df1 + df2'は、両方が要素を持たない場合はNaNを返すため、動作しません。この場合、あなたは何をしたいですか?結果にゼロが必要ですか? – BrenBarn

答えて

48

x.add(y, fill_value=0)?答えは、より一般的な作りのために

import pandas as pd 

df1 = pd.DataFrame([(1,2),(3,4),(5,6)], columns=['a','b']) 
Out: 
    a b 
0 1 2 
1 3 4 
2 5 6 

df2 = pd.DataFrame([(100,200),(300,400),(500,600)], columns=['a','b']) 
Out: 
    a b 
0 100 200 
1 300 400 
2 500 600 

df_add = df1.add(df2, fill_value=0) 
Out: 
    a b 
0 101 202 
1 303 404 
2 505 606 
+0

完璧な、ちょうど私が後だった。ありがとう – cs0679

7

私が正しくあなたを理解していれば、あなたのような何かをしたい:

(x.reindex_like(y).fillna(0) + y.fillna(0)).fillna(0) 

これは、2つのデータフレームの合計を与えるだろう。値が1つのデータフレームであり、他のデータフレームでない場合、その位置の結果はその既存の値になります。両方のデータフレームに値がない場合、その位置の結果はゼロになります。

>>> x 
    A B C 
0 1 2 NaN 
1 3 NaN 4 
>>> y 
    A B C 
0 8 NaN 88 
1 2 NaN 5 
2 10 11 12 
>>> (x.reindex_like(y).fillna(0) + y.fillna(0)).fillna(0) 
    A B C 
0 9 2 88 
1 5 0 9 
2 10 11 12 
+1

ありがとうございましたが、両方のデータフレームに異なる列があるため、データを非常にうまく説明できませんでした。データフレーム1のA、B、Cとデータフレーム2のA、B、Dの出力です。出力はA、B、C、Dのデータフレームでなければなりません。 – cs0679

+0

ありがとう! – ivrin

0

...最初私はその後、私は私のパターンにそれらのそれぞれに参加します、両方のデータフレームを同期させるための一般的な指標になります(日付)と私はの列を合計します同じ名前、最終的には両方のデータフレーム(そのうちの一つに追加の列を削除)に参加、

あなたはここ(グーグルから撮影したGoogleの株価との)例を見ることができます:

import numpy as np 
import pandas as pd 
import datetime as dt 

prices = pd.DataFrame([[553.0, 555.5, 549.3, 554.11, 0], 
         [556.8, 556.8, 544.05, 545.92, 545.92], 
         [545.5, 546.89, 540.97, 542.04, 542.04]], 
         index=[dt.datetime(2014,11,04), dt.datetime(2014,11,05), dt.datetime(2014,11,06)], 
         columns=['Open', 'High', 'Low', 'Close', 'Adj Close']) 

corrections = pd.DataFrame([[0, 555.22], [1238900, 0]], 
        index=[dt.datetime(2014,11,3), dt.datetime(2014,11,4)], 
        columns=['Volume', 'Adj Close']) 

dates = pd.DataFrame(prices.index, columns = ['Dates']).append(pd.DataFrame(corrections.index, columns = ['Dates'])).drop_duplicates('Dates').set_index('Dates').sort(axis=0) 
df_corrections = dates.join(corrections).fillna(0) 
df_prices = dates.join(prices).fillna(0) 

for col in prices.columns: 
    if col in corrections.columns: 
     df_prices[col]+=df_corrections[col] 
     del df_corrections[col] 

df_prices = df_prices.join(df_corrections) 
1

どちらも上記の回答 - fillna(0)のいずれかが異なる構造を持っている場合は、直接追加するとNan値が得られます。

その優れた

df.add(other_df, fill_value=0)

関連する問題