2017-11-14 8 views
0

ように私は私がDFを持っている日時、異なるIDと異なる値 としてIDEXとのデータフレームを持っている:私はピボットとして、このデータの表現をしたいパンダピボット操作は、最後の行の値を持つNoneを交換しないで

data = [ 
{ 'datetime_start' : "2017-03-15 14:31:20.507", "id" : "usr_21", "value": "-1.286452"}, 
{ 'datetime_start' : "2017-03-16 15:17:45.550", "id" : "usr_15", "value": "-2.349203"}, 
{ 'datetime_start' : "2017-03-17 14:20:47.437", "id" : "usr_13", "value": "-2.397038"}, 
{ 'datetime_start' : "2017-03-19 09:43:47.262", "id" : "usr_12", "value": "-1.250512"}, 
{ 'datetime_start' : "2017-03-19 15:18:47.941", "id" : "usr_21", "value": "-0.681998"}, 
{ 'datetime_start' : "2017-03-19 20:03:52.905", "id" : "usr_15", "value": "-1.018452"}, 
{ 'datetime_start' : "2017-03-22 13:40:48.178", "id" : "usr_21", "value": "-1.531373"}, 
{ 'datetime_start' : "2017-03-22 19:54:48.320", "id" : "usr_18", "value": "-3.789466"}, 
{ 'datetime_start' : "2017-03-23 13:53:48.789", "id" : "usr_21", "value": "-1.288360"}, 
{ 'datetime_start' : "2017-03-24 15:54:48.649", "id" : "usr_21", "value": "0.213171"}, 
{ 'datetime_start' : "2017-03-25 17:53:48.422", "id" : "usr_13", "value": "-2.020710"}, 
{ 'datetime_start' : "2017-03-26 06:10:48.197", "id" : "usr_12", "value": "-1.484709"}, 
{ 'datetime_start' : "2017-03-15 14:31:20.507", "id" : "usr_21", "value": "-1.286452"}, 
{ 'datetime_start' : "2017-03-16 15:18:45.550", "id" : "usr_18", "value": "-2.349203"}, 
{ 'datetime_start' : "2017-03-17 14:18:47.437", "id" : "usr_11", "value": "-2.397038"}, 
{ 'datetime_start' : "2017-03-19 09:48:47.262", "id" : "usr_15", "value": "-1.250512"}, 
{ 'datetime_start' : "2017-03-19 15:18:47.941", "id" : "usr_21", "value": "-0.681998"}, 
{ 'datetime_start' : "2017-03-19 20:03:52.905", "id" : "usr_13", "value": "-1.018452"}, 
{ 'datetime_start' : "2017-03-22 13:53:48.178", "id" : "usr_21", "value": "-1.531373"}, 
{ 'datetime_start' : "2017-03-22 19:53:48.320", "id" : "usr_18", "value": "-3.789466"}, 
{ 'datetime_start' : "2017-03-23 13:53:48.789", "id" : "usr_21", "value": "-1.288360"}, 
{ 'datetime_start' : "2017-03-24 15:53:48.649", "id" : "usr_11", "value": "0.213171"}, 
{ 'datetime_start' : "2017-03-25 16:53:48.422", "id" : "usr_13", "value": "-2.020710"}, 
{ 'datetime_start' : "2017-03-26 06:08:48.197", "id" : "usr_15", "value": "-1.484709"} 
] 

df = pd.DataFrame(data) 
df['datetime_start'] = pd.to_datetime(df['datetime_start']) 

table = pd.pivot_table(df, values='value', index='id'], 
        columns=['index'], aggfunc=np.sum) 

im1 それがどれ

ません値がない場合ので、各(ID、日時)のために、私たちは価値 を持っています210

は、このルールをなし値を交換するエレガントな方法はあります:伝播のこの種として

if value(id_i, datetime_i) == None : 
    if value(id_i, datetime_i-1) != 0 : 
     value(id_i, datetime_i) = value(id_i, datetime_i-1) 
    else: 
     value(id_i, datetime_i) = 0 

enter image description here

+0

申し訳ありませんが、最初の行は '0,0、None、-2.397038、-2.397038、None、None、...'ですか?または最終的にNaNはありませんか? – jezrael

+0

はい、0と値も伝播する必要があります。 いいえもう分かりません:) – slideWXY

答えて

1

私はあなたがcolumns='datetime_start'最初にcolumns=['index']を変更して使用して必要があると思いますffillmethod='ffill'fillna):

table = (pd.pivot_table(df, 
         values='value', 
         index='id', 
         columns='datetime_start', 
         aggfunc=np.sum) 
      .ffill(axis=1, limit=1)) 
少ないデータで

EDIT:前の値がNoneでない場合

data = [ 
{ 'datetime_start' : "2017-03-15 14:31:20.507", "id" : "usr_21", "value": "-1.286452"}, 
{ 'datetime_start' : "2017-03-16 15:17:45.550", "id" : "usr_15", "value": "-2.349203"}, 
{ 'datetime_start' : "2017-03-17 14:20:47.437", "id" : "usr_13", "value": "-2.397038"}, 
{ 'datetime_start' : "2017-03-19 09:43:47.262", "id" : "usr_12", "value": "-1.250512"}, 
] 

df = pd.DataFrame(data) 
df['datetime_start'] = pd.to_datetime(df['datetime_start']) 

table = (pd.pivot_table(df, 
         values='value', 
         index='id', 
         columns='datetime_start', 
         aggfunc=np.sum) 
     ) 


print (table) 
datetime_start 2017-03-15 14:31:20.507 2017-03-16 15:17:45.550 \ 
id                
usr_12       None     None 
usr_13       None     None 
usr_15       None    -2.349203 
usr_21      -1.286452     None 

datetime_start 2017-03-17 14:20:47.437 2017-03-19 09:43:47.262 
id                
usr_12       None    -1.250512 
usr_13      -2.397038     None 
usr_15       None     None 
usr_21       None     None 

1つの値のみNoneを交換 - そして、パラメータlimitを追加します。

table1 = (pd.pivot_table(df, 
         values='value', 
         index='id', 
         columns='datetime_start', 
         aggfunc=np.sum) 
      .ffill(axis=1, limit=1) 
      ) 

print (table1) 
datetime_start 2017-03-15 14:31:20.507 2017-03-16 15:17:45.550 \ 
id                
usr_12       None     None 
usr_13       None     None 
usr_15       None    -2.349203 
usr_21      -1.286452    -1.286452 

datetime_start 2017-03-17 14:20:47.437 2017-03-19 09:43:47.262 
id                
usr_12       None    -1.250512 
usr_13      -2.397038    -2.397038 
usr_15      -2.349203     None 
usr_21       None     None 

は、最後のすべてを置き換える、以前の非NaNsによってすべてNaN Sを交換してくださいNaNによって0を削除し、limitを削除し、fillna(0)を追加します。

table2 = (pd.pivot_table(df, 
         values='value', 
         index='id', 
         columns='datetime_start', 
         aggfunc=np.sum) 
      .ffill(axis=1) 
      .fillna(0) 
      ) 

print (table2) 
datetime_start 2017-03-15 14:31:20.507 2017-03-16 15:17:45.550 \ 
id                
usr_12        0      0 
usr_13        0      0 
usr_15        0    -2.349203 
usr_21      -1.286452    -1.286452 

datetime_start 2017-03-17 14:20:47.437 2017-03-19 09:43:47.262 
id                
usr_12        0    -1.250512 
usr_13      -2.397038    -2.397038 
usr_15      -2.349203    -2.349203 
usr_21      -1.286452    -1.286452 
+0

感謝jezrael、いつものようにあなたのトリックawsomeです。あなたはパンダの魔法使いですか? それは素晴らしいですが、table21.iloc [-1]とtable2.iloc [-1](totaly dfをインポートするとき)を見てください 値は倍になります.... – slideWXY

+0

うーん、わかりません。 '' datetime_start ': "2017-03-15 14:31:20.507"、 "id": "usr_21"、 "value": "-1.286452"}、 {0} ': "2017-03-16 15:17:45.550"、 "id": "usr_15"、 "value": "-2.349203"}、 {' datetime_start ': "2017-03-17 14:20:47.437 "id": "usr_13"、 "value": "-2.397038"}、 {'datetime_start': "2017-03-19 09:43:47.262"、 "id": "usr_12"、 "value" : "-1.250512"}、 ] '?あなたは答えに追加できますか?あるいは、 '.ffill(axis = 1、limit = 1) .fillna(0)'だけが必要ですか?ありがとう。 – jezrael

+0

これは大丈夫ですよね。自分のdfデータを完全な方法で変更します。 私はデータを狂わせました – slideWXY

関連する問題