2016-12-01 27 views
0

,我想用一天(上采样)重新索引。现在按月索引的值现在应除以该月的天数。除索引外,还应在分组中使用一列。类似于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/31)。

+0

你可以添加样本数据和期望的输出? – jezrael

+1

实际数据在索引中是否重复?可以省略'df = pd.concat([df,df])'? – jezrael

+0

并感谢您的示例。 – jezrael

回答

1

首先需要添加新的行DataFrame与同一指数第一行和索引值的值,只有一个月的第一天。

然后将列val除以DatetimeIndex.day并最后使用groupby,resampleffill新值。

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月份会有31天。由于1月份的第一个'val'是'1',因此操作后的每个val应该等于1/31. –

+0

另外,任何给定月份中同一天的同一班级应该具有相同的值,因为月份的“val”在该月份/班级组合中的日期之间划分。 –

+0

我编辑答案,请检查它。 – jezrael