54

2 つdataframesあり、どちらも によって索引付けされていtimeseriesます。新しい を形成するために要素を一緒に追加する必要がdataframeありますが、インデックスと列が同じ場合に限ります。項目が のいずれにも存在しない場合、dataframeそれはゼロとして扱われるべきです。

使用してみまし.addたが、これはインデックスと列に関係なく合計されます。単純なものも試しましたが、これは両方のデータフレームに要素がない場合combined_data = dataframe1 + dataframe2に与えます。NaN

助言がありますか?

4

4 に答える 4

104

どう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
于 2012-06-20T03:28:12.140 に答える
15

私があなたを正しく理解しているなら、あなたは次のようなものが欲しいです:

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

これにより、2つのデータフレームの合計が得られます。値が一方のデータフレームにあり、もう一方のデータフレームにはない場合、その位置での結果はその既存の値になります(XのB0とYのB0を見て、最終出力を見てください)。両方のデータフレームで値が欠落している場合、その位置での結果はゼロになります(XのB1とYのB1を見て、最終出力を見てください)。

>>> 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
于 2012-06-19T19:02:15.203 に答える
2

答えをより一般的にするために...最初に両方のデータフレームを同期するための共通インデックスを取得し、次にそれらのそれぞれをパターン(日付)に結合し、同じ名前の列を合計し、最後に両方のデータフレームを結合します(それらの1つで追加された列を削除する)、

ここで例を見ることができます(Googleから取得した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)
于 2014-11-07T11:04:13.510 に答える