计算带有日期标题的数据框中数据行的平均值,由“ datetime”列指定

问题描述 投票:-1回答:1

我有一个数据框,其中包含2014-2018年客户的ID及其费用。我想要的是具有每个ID的费用的平均值,但是在计算平均值时只能考虑某个日期之前的年份(因此,“日期”列指示可以考虑平均值的列)。

[示例:对于索引0(ID:12),日期表示为'2016-03-08',则平均值应取自'y_2014'和'y_2015'列,因此对于该索引,平均值为111.0。如果日期过早(例如,在2014年某个时候或更早),则应返回NaN(请参见索引6和9)。

初始数据框:

   y_2014  y_2015  y_2016  y_2017  y_2018        Date  ID  
0   100.0   122.0     324     632     NaN  2016-03-08  12   
1   120.0   159.0      54     452   541.0  2015-04-09  96   
2     NaN   164.0     687     165   245.0  2016-02-15  20   
3   180.0   421.0     512     184   953.0  2018-05-01  73  
4   110.0   654.0     913     173   103.0  2017-08-04  84   
5   130.0     NaN     754     124   207.0  2016-07-03  26   
6   170.0   256.0     843      97   806.0  2013-02-04  87    
7   140.0   754.0      95     101   541.0  2016-06-08  64    
8    80.0   985.0     184      84    90.0  2019-03-05  11  
9    96.0    65.0     127     130   421.0  2014-05-14  34     

所需的输出:

   y_2014  y_2015  y_2016  y_2017  y_2018        Date  ID    mean
0   100.0   122.0     324     632     NaN  2016-03-08  12   111.0
1   120.0   159.0      54     452   541.0  2015-04-09  96   120.0
2     NaN   164.0     687     165   245.0  2016-02-15  20   164.0
3   180.0   421.0     512     184   953.0  2018-05-01  73  324.25
4   110.0   654.0     913     173   103.0  2017-08-04  84   559.0
5   130.0     NaN     754     124   207.0  2016-07-03  26   130.0
6   170.0   256.0     843      97   806.0  2013-02-04  87     NaN
7   140.0   754.0      95     101   541.0  2016-06-08  64     447
8    80.0   985.0     184      84    90.0  2019-03-05  11   284.6
9    96.0    65.0     127     130   421.0  2014-05-14  34     NaN

尝试过的代码:->我仍在努力,因为我真的不知道如何开始,所以到目前为止我只上传了数据框,可能带有'datetime'-package的东西要获得所需的数据帧?

import pandas as pd

import numpy as np

import datetime


df = pd.DataFrame({"ID":   [12,96,20,73,84,26,87,64,11,34],
 
                 "2014": [100,120,np.nan,180,110,130,170,140,80,96],
   
                 "2015": [122,159,164,421,654,np.nan,256,754,985,65],
     
                 "2016": [324,54,687,512,913,754,843,95,184,127],
   
                 "2017": [632,452,165,184,173,124,97,101,84,130],
   
                 "2018": [np.nan,541,245,953,103,207,806,541,90,421],
 
                 "Date": ['2016-03-08', '2015-04-09', '2016-02-15', '2018-05-01', '2017-08-04',
                          
                          '2016-07-03', '2013-02-04', '2016-06-08', '2019-03-05', '2014-05-14']})


print(df)

python pandas datetime mean
1个回答
0
投票

我的方法涉及从数据中提取年份并进行掩盖:

# the years from columns
data = df.filter(like='y_')
data_years = data.columns.str.extract('(\d+)')[0].astype(int)

# the years from Date
years = pd.to_datetime(df.Date).dt.year.values

df['mean'] = data.where(data_years<years[:,None]).mean(1)

输出:

   y_2014  y_2015  y_2016  y_2017  y_2018       Date  ID    mean
0   100.0   122.0     324     632     NaN 2016-03-08  12  111.00
1   120.0   159.0      54     452   541.0 2015-04-09  96  120.00
2     NaN   164.0     687     165   245.0 2016-02-15  20  164.00
3   180.0   421.0     512     184   953.0 2018-05-01  73  324.25
4   110.0   654.0     913     173   103.0 2017-08-04  84  559.00
5   130.0     NaN     754     124   207.0 2016-07-03  26  130.00
6   170.0   256.0     843      97   806.0 2013-02-04  87     NaN
7   140.0   754.0      95     101   541.0 2016-06-08  64  447.00
8    80.0   985.0     184      84    90.0 2019-03-05  11  284.60
9    96.0    65.0     127     130   421.0 2014-05-14  34     NaN
© www.soinside.com 2019 - 2024. All rights reserved.