2017-07-05 14 views
1

私はパンダのデータフレームに2つの列があります。最初のものは1つの日付( 'action_date')、2つ目は日付のリスト( 'verification_date')です。私は 'action_date'の日付と対応する 'verification_date'列のリストの各日付との間の時間差を計算しようとしています。そして、df新しい列にverify_dateの日付の数を360日を超えて、または360日未満で。パンダの列リストの操作

は、ここに私のコードです:

DFは、日付が異なっているとして本当ではない各行に対して同じ値を持っている場合を除きこれはちょっと作品
df = pd.DataFrame() 
df['action_date'] = ['2017-01-01', '2017-01-01', '2017-01-03'] 
df['action_date'] = pd.to_datetime(df['action_date'], format="%Y-%m-%d") 
df['verification_date'] = ['2016-01-01', '2015-01-08', '2017-01-01'] 
df['verification_date'] = pd.to_datetime(df['verification_date'], format="%Y-%m-%d") 
df['user_name'] = ['abc', 'wdt', 'sdf'] 
df.index = df.action_date 
df = df.groupby(pd.TimeGrouper(freq='2D'))['verification_date'].apply(list).reset_index() 


def make_columns(df): 
    df = df 
    for i in range(len(df)): 
     over_360 = [] 
     under_360 = [] 
     for w in [(df['action_date'][i]-x).days for x in df['verification_date'][i]]: 
      if w > 360: 
       over_360.append(w) 
      else: 
       under_360.append(w) 
     df['over_360'] = len(over_360) 
     df['under_360'] = len(under_360) 
return df 

make_columns(df) 

。たとえば、データフレームの最初の行では、action_dateとリストの両方の項目との間に検証日に360日以上の差があるため、over_360カラムには2が設定されます。ただし、空です代わりにunder_360列には1が入力されます。これは 'action_date'の2行目についてのみ正確です。

私はループを台無しにしていると感じていますが、本当に立ち往生しています。すべての助けてくれてありがとう!

+0

すべてのaction_dateをすべての検証日と比較し、これらの2つの日付間の日数の差に応じてover_360およびunder_360の列に値を設定します。右 ? –

答えて

1

あなたの問題は、常にこれらの行と最後の計算の値を持つ列全体を更新したことだった:あなたはそれに応じて各ラインの計算のための値を設定されている代わりに何をしたいのか

df['over_360'] = len(over_360) 
df['under_360'] = len(under_360) 

、あなたこれらと上記の行を交換することにより、これを行うことができます:それはあるん何

df.set_value(i,'over_360',len(over_360)) 
df.set_value(i,'under_360',len(under_360)) 

を、それがラインiと列over_360またはunder_360に値を設定します。

については、hereをご覧ください。あなたがset_valuesを使用して好きではない場合

あなたもこれを使用することができます。

df.ix[i,'over_360'] = len(over_360) 
df.ix[i,'under_360'] = len(under_360) 

あなたがdataframe.ix hereを確認することができます。

+1

ありがとうございます。これは完璧に働いた!!そしてそれは完全に意味をなさない。 – cgp25

1

あなたはこれをしようとする場合があります:

df['over_360'] = df.apply(lambda x: sum([((x['action_date'] - i).days >360) for i in x['verification_date']]) , axis=1) 
df['under_360'] = df.apply(lambda x: sum([((x['action_date'] - i).days <360) for i in x['verification_date']]) , axis=1) 

私はそれが少し速くなるべきだと考えています。 == 360なら何をするか指定していないので、>または<> =または< =に変更することができます。