假设我们有一个如下所示的示例 Dataframe
# Create a sample dataframe
df = pd.DataFrame({'num_posts': [4, 6, 3, 9, 1, 14, 2, 5, 7, 2,12],
'date' : ['2020-03-01', '2020-01-02', '2020-01-03',
'2020-01-04', '2019-01-05', '2019-01-06',
'2020-01-07', '2020-01-08', '2020-01-09',
'2020-01-10','2020-01-11']})
cols=['num_posts']
现在我需要创建一些特性,比如上一年最后一周的sum(num_posts),上一年最后一周与上一年最后一个月的比率等等。
我现在要做的是
def create_calendar_columns(df,dt):
df['day_number']= pd.to_datetime(df[dt]).dt.dayofyear
df['week_number']= pd.to_datetime(df[dt]).dt.isocalendar().week
df['year']= pd.to_datetime(df[dt]).dt.year
return df
然后
def calculate_curr_year_sum(df,cols,dt):
df=create_calendar_columns(df,dt)
df[dt]=pd.to_datetime(df[dt])
for col in cols:
df['curr_year_sum_'+str(col)]= df.loc[df['year']==df[dt].dt.year,col].sum()
# sum of 'col' for all rows having same year as of current row value
但它没有选择具有相同年份值的 Dataframe 子集。而是取整个 Dataframe 的总和。它在所有行中插入值=65,这是“num_posts”的总和
我如何选择 Dataframe 的子集,其中的行与年等于列的当前行值?
1条答案
按热度按时间fhity93d1#
这是因为
df['year']==df[dt].dt.year
在任何地方都是True
,你不会在不同的年份迭代,所以你不会看到不同年份的结果,我认为你需要做的是groupby转换: