2017-02-09 8 views
0

この質問には2つの部分があります:日付に基づくパンダデータフレームの列方向操作(ソート問題)

1)これを行うより良い方法はありますか?

2)#1にNOの場合、どのように日付の問題を修正できますか?

GROUP DATE  VALUE DELTA 
    A 12/20/2015  2.5  ?? 
    A 11/30/2015  25   
    A 1/31/2016  8.3  
    B  etc   etc 
    B  etc   etc 
    C  etc   etc 
    C  etc   etc 
  • を次のように私はこの表現であるデータフレームを有する

    、各グループのために100行(一意の日付を表す各列)に近いがあります。

GROUPの各文字について、連続する日付の間の値の変化を検出したいと思います。したがって、たとえばGROUP Aの場合、2015年11月30日と2015年12月20日の間に変更が必要です(これは-22.5です)。現在、私は次のことを行っています:

df['DATE'] = pd.to_datetime(df['DATE'],infer_datetime_format=True) 
df.sort_values('DATE',ascending=True) 
df_out = [] 
for GROUP in df.GROUP.unique(): 
    x = df[df.GROUP == GROUP] 
    x['VALUESHIFT'] = x['VALUE'].shift(+1) 
    x['DELTA'] = x['VALUE'].sub(x['VALUESHIFT']) 
    df_out.append(x) 
df_out = pd.concat(df_out) 

私が挑戦しているのは、日付が正しくソートされていないということです。だからシフトが起こって、デルタを計算すると、それは実際に連続する日付間のデルタではありません。

これは適切な処理方法ですか?どうすれば私の日付の問題を解決できますか?自分の質問に答える

Applying datetime format in pandas for sorting

how to make a pandas dataframe column into a datetime object showing just the date to correctly sort

doing calculations in pandas dataframe based on trailing row

Pandas - Split dataframe into multiple dataframes based on dates?

+0

追加するべきこと - 私はデータフレームにインデックスを設定していません。私は、データフレームを作成するときに設定されている既定の数値0,1,2,3,4、インデックスを持っています。 – Doug

答えて

0

:私は無駄に以下を試みた/検討しました。これは動作します:

df['DATE'] = pd.to_datetime(df['DATE'],infer_datetime_format=True) 
df_out = [] 
for ID in df.GROUP.unique(): 
    x = df[df.GROUP == ID] 
    x.sort_values('DATE',ascending=True, inplace=True) 
    x['VALUESHIFT'] = x['VALUE'].shift(+1) 
    x['DELTA'] = x['VALUE'].sub(x['VALUESHIFT']) 
    df_out.append(x) 
df_out = pd.concat(df_out) 

1)並べ替え値にinplace = Trueが追加されました。

2)forループ内にソートを追加しました。

3)GROUPをIDからループに変更したのは、それがカラム名の名前でもあるからです。

関連する問題