2017-03-14 13 views
0

私は特定のIDの開始日と終了日(df_with_start_end)を持っていると私は別のデータフレーム(df_dates)から同じIDを持つ他の日付の間である理解しようそれら。結果は新しい列に入力する必要があります。のpythonパンダ - 他の日付のために2つの日付の間の期間を分析

アイデアはユニークなIDでデータフレームdf_with_start_endを繰り返し処理していましたが、df_with_start_endの開始日と終了日にdf_datesの他の日付がある場合、解析しようとするすべてのIDについて考えました。

私の実装では、このようなものですが、それはそのように動作しません。

for k in df_with_start_end['ID']: 
    df_with_start_end[k]['FREE_PERIOD'] = df_with_start_end[k]['START_DATE'] <= df_dates[k]['DATE'] < df_with_start_end[k]['END_DATE'] 

私はこのエラーを取得する:ここで

Traceback (most recent call last): 
    File "/opt/anaconda/lib/python3.6/site-packages/pandas/indexes/base.py", line 2134, in get_loc 
    return self._engine.get_loc(key) 
    File "pandas/index.pyx", line 132, in pandas.index.IndexEngine.get_loc (pandas/index.c:4433) 
    File "pandas/index.pyx", line 154, in pandas.index.IndexEngine.get_loc (pandas/index.c:4279) 
    File "pandas/src/hashtable_class_helper.pxi", line 732, in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13742) 
    File "pandas/src/hashtable_class_helper.pxi", line 740, in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13696) 
KeyError: 3685509 

は、データフレームの例である:

df_with_start_end 
ID START_DATE END_DATE FREE_PERIOD 
1 2015-02-13 2016-02-13 False 
2 2014-08-27 2015-08-27 True 

df_dates 
ID DATE 
1 2014-04-23 
1 2015-08-02 
1 2015-09-15 
2 2014-06-19 
2 2017-01-07 

私はループがpythonで遅い聞いたが、私の中でそれらを回避する方法があります場合?あなたが行を反復処理したいが、あなたが実際の列の上にそれを行うよう

答えて

1

が見えます。

for k in df_with_start_end['ID']: を意味する。kは、IDの値である。しかし

df_with_start_end[k]は、その値がkである列にアクセスします。あなたの列はSTART_DATE END_DATE FREE_PERIODなので、求める値が存在しないというエラーが表示されます。

それに対する解決策は、最初のアクセスに列してからコールの順序を切り替えることによりIDいずれかを次のようになります。

df_with_start_end['FREE_PERIOD'][k]

しかしloc機能を使用することですよりよい方法:

df_with_start_end.loc[k, 'FREE_PERIOD']

+0

IDも列です。 – haapoo

+0

(key、self.obj._get_axis_name(軸)) KeyError: 'ラベル[3609]は[インデックス]にありません 値3609はIDです。それから、IDのインデックスを取得しようとしましたが、すべての時間エラーが発生します。 もう1つのアイデアは、両方のデータフレームをdf_with_start_end.ID = df_dates.IDで結合することです。 – haapoo

+0

@haapoo、 'ID'列があなたのインデックス列でない可能性はありますか? 'df_dates.set_index([ID]、inplace = True)'と 'df_with_start_end'と同じ設定をしてください。 – ehudk

0

最も簡単な方法は、両方のdataFramesに参加することでした。この結合のために、私はmerge()を使用しました。 それから、それらを比較する方がはるかに優れています。 問題は、それらに参加することを避けようとしたことですが、時にはそれがより良い方法であるように見えます。

関連する問題