2014-01-20 5 views
26

同じ名前の['a'、 'b'、 'c']を持ち、日付で索引付けされた2つのDataFrames df1とdf2があります。 日付インデックスにも同様の値を設定できます。 ['c']列のデータのみが 'df1'と 'df2'にそれぞれ名前が変更され、正しい日付インデックスが付けられたDataFrame df3を作成したいと考えています。私の問題は、インデックスを適切にマージする方法が得られないということです。類似のインデックスを持つ他のDataFramesの列からpandas DataFrameを作成する

df1 = pd.DataFrame(np.random.randn(5,3), index=pd.date_range('01/02/2014',periods=5,freq='D'), columns=['a','b','c']) 
df2 = pd.DataFrame(np.random.randn(8,3), index=pd.date_range('01/01/2014',periods=8,freq='D'), columns=['a','b','c']) 
df1 
       a  b   c 
2014-01-02 0.580550 0.480814 1.135899 
2014-01-03 -1.961033 0.546013 1.093204 
2014-01-04 2.063441 -0.627297 2.035373 
2014-01-05 0.319570 0.058588 0.350060 
2014-01-06 1.318068 -0.802209 -0.939962 

df2 
       a  b   c 
2014-01-01 0.772482 0.899337 0.808630 
2014-01-02 0.518431 -1.582113 0.323425 
2014-01-03 0.112109 1.056705 -1.355067 
2014-01-04 0.767257 -2.311014 0.340701 
2014-01-05 0.794281 -1.954858 0.200922 
2014-01-06 0.156088 0.718658 -1.030077 
2014-01-07 1.621059 0.106656 -0.472080 
2014-01-08 -2.061138 -2.023157 0.257151 

はDF3データフレームは次の形式を持っている必要があります。

df3 
       df1  df2 
2014-01-01 NaN  0.808630 
2014-01-02 1.135899 0.323425 
2014-01-03 1.093204 -1.355067 
2014-01-04 2.035373 0.340701 
2014-01-05 0.350060 0.200922 
2014-01-06 -0.939962 -1.030077 
2014-01-07 NaN  -0.472080 
2014-01-08 NaN  0.257151 

しかし、DF2の日付インデックスが広くなるようDF1列内のNaNと

。 (この例では、2014-01-01、2014-01-07、2014-01-08のNaNを取得します)

ありがとうございました。

答えて

40

あなたはconcatを使用することができます。

In [11]: pd.concat([df1['c'], df2['c']], axis=1, keys=['df1', 'df2']) 
Out[11]: 
       df1  df2 
2014-01-01  NaN -0.978535 
2014-01-02 -0.106510 -0.519239 
2014-01-03 -0.846100 -0.313153 
2014-01-04 -0.014253 -1.040702 
2014-01-05 0.315156 -0.329967 
2014-01-06 -0.510577 -0.940901 
2014-01-07  NaN -0.024608 
2014-01-08  NaN -1.791899 

[8 rows x 2 columns] 
+0

これは私が言うよりよい解決策です –

+0

こんにちは、ありがとうございました。それはまた速いようです! – user3153467

+0

こんにちは、私は自分のデータをテストしましたが、エラーが発生します(AssertionError:インデックスの長さが値と一致しません)。それが動作しないように見える唯一の理由は、type(df1 ['c'])=> pandas.core.series.TimeSeriesであり、私のデータはpandas.core.series.Seriesです。何かご意見は ? – user3153467

4

まあ、私はマージが行く方法だろうとは思っていません。個人的には、日付のインデックスを作成し、リスト内包表記を使用して列を構築することによって、新しいデータフレームを構築します。おそらく最もpythonic方法ではないが、それは私のために働くようだ!

import pandas as pd 
import numpy as np 

df1 = pd.DataFrame(np.random.randn(5,3), index=pd.date_range('01/02/2014',periods=5,freq='D'), columns=['a','b','c']) 
df2 = pd.DataFrame(np.random.randn(8,3), index=pd.date_range('01/01/2014',periods=8,freq='D'), columns=['a','b','c']) 

# Create an index list from the set of dates in both data frames 
Index = list(set(list(df1.index) + list(df2.index))) 
Index.sort() 

df3 = pd.DataFrame({'df1': [df1.loc[Date, 'c'] if Date in df1.index else np.nan for Date in Index],\ 
       'df2': [df2.loc[Date, 'c'] if Date in df2.index else np.nan for Date in Index],},\ 
       index = Index) 

df3 
+0

こんにちは、おかげで答えを! – user3153467

関連する問題