2016-12-01 12 views
0

月単位でインデックスされたデータフレームを想定して、1日ごとに再インデックスする(アップサンプル)。以前に月ごとに索引付けされた値は、今月の日数で除算されます。索引に加えて、列をグループ化で使用する必要があります。 thisに似ています - グループ化でも列が使用されているだけです。 インデックス+カラムを持つパンダのアップサンプリングデータフレーム

import pandas as pd 
import numpy as np 

np.random.seed(1234) 
tidx_m = pd.date_range('2011-01-31', periods=5, freq='M') 
df = pd.DataFrame(np.random.randint(0, 2, (5, 2)), columns=['class', 'val']) 
df.index = tidx_m 
df = pd.concat([df, df]) 
df.ix[:5, 'class'] = 0 
df.ix[5:, 'class'] = 1 
print(df) 

      class val 
2011-01-31  0 1 
2011-02-28  0 1 
2011-03-31  0 0 
2011-04-30  0 1 
2011-05-31  0 1 
2011-01-31  1 1 
2011-02-28  1 1 
2011-03-31  1 0 
2011-04-30  1 1 
2011-05-31  1 1 

代わりヶ月の日にインデックスをアップサンプリングした後、私は、日時、インデックス classでグループにしたいと思います。 「val」の値は、その月のすべての日に再配分する必要があります(1は1月の1日あたり1/31になります)。

+0

あなたはサンプルデータと所望の出力を追加することはできますか? – jezrael

+1

実際のデータはインデックスに重複していますか? 'df = pd.concat([df、df])'は省略可能ですか? – jezrael

+0

サンプルありがとうございます。 – jezrael

答えて

1

最初の行の値と同じインデックスのインデックス値を持つ新しい行をDataFrameに追加する必要があります。これは月の最初の日のみです。

valDatetimeIndex.dayで、最後にgroupbyresampleffillの新しい値で割ります。

df.val = df.val.div(df.index.day) 

first_idx = df.index[0] - pd.offsets.MonthBegin(1) 
print (first_idx) 
2011-01-01 00:00:00 

first_class_val = df.iloc[0] 
print (first_class_val) 
class 0.000000 
val  0.032258 
Name: 2011-01-31 00:00:00, dtype: float64 

df.loc[ first_idx] = first_class_val 
print (df) 
      class  val 
2011-01-31 0.0 0.032258 
2011-02-28 0.0 0.035714 
2011-03-31 0.0 0.000000 
2011-04-30 0.0 0.033333 
2011-05-31 0.0 0.032258 
2011-01-31 1.0 0.032258 
2011-02-28 1.0 0.035714 
2011-03-31 1.0 0.000000 
2011-04-30 1.0 0.033333 
2011-05-31 1.0 0.032258 
2011-01-01 0.0 0.032258 
df1 = df.groupby('class').resample('D').ffill().reset_index(level=0, drop=True) 

print (df1) 
      class  val 
2011-01-01 0.0 0.032258 
2011-01-02 0.0 0.032258 
2011-01-03 0.0 0.032258 
2011-01-04 0.0 0.032258 
2011-01-05 0.0 0.032258 
2011-01-06 0.0 0.032258 
2011-01-07 0.0 0.032258 
2011-01-08 0.0 0.032258 
2011-01-09 0.0 0.032258 
2011-01-10 0.0 0.032258 
2011-01-11 0.0 0.032258 
2011-01-12 0.0 0.032258 
2011-01-13 0.0 0.032258 
2011-01-14 0.0 0.032258 
2011-01-15 0.0 0.032258 
... 
... 
+0

これは、1月以降の複数の日のみを提供するように見えます。私は1月31日を予定しています。 Janの最初のvalは1であるため、操作後の各valは1/31に等しくなければなりません。 –

+0

また、月のvalが取得されるため、同じ月の同じクラスが同じ値を持つ必要がありますその月/クラスのコンボの日に分けられます。 –

+0

私は答えを編集します、それを確認してください。 – jezrael

関連する問題