pandas 通过基于当前行值选择 Dataframe 子集来创建新列,并对另一列求和

edqdpe6u  于 2023-03-16  发布在  其他
关注(0)|答案(1)|浏览(152)

假设我们有一个如下所示的示例 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 的子集,其中的行与年等于列的当前行值?

fhity93d

fhity93d1#

这是因为df['year']==df[dt].dt.year在任何地方都是True,你不会在不同的年份迭代,所以你不会看到不同年份的结果,我认为你需要做的是groupby转换:

>>> df.groupby("year")["num_posts"].transform("sum")
0     50
1     50
2     50
3     50
4     15
5     15
6     50
7     50
8     50
9     50
10    50

相关问题