在特定日期时间之前出现的列中数据的Pandas DataFrame平均值

本教程将介绍在特定日期时间之前出现的列中数据的Pandas DataFrame平均值的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

在特定日期时间之前出现的列中数据的Pandas DataFrame平均值 教程 第1张

问题描述

我有一个数据框,里面有2014-2018年的客户ID和他们的费用。我想要的是每个ID的费用的平均值,但在计算平均值时,只能考虑某个日期之前的年份(因此,列‘Date’表示可以考虑哪些列作为平均值)。

例如:对于索引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 mean
0100.0122.0  324  632  NaN  2016-03-08  12111.0
1120.0159.054  452541.0  2015-04-09  96120.0
2  NaN164.0  687  165245.0  2016-02-15  20164.0
3180.0421.0  512  184953.0  2018-05-01  73  324.25
4110.0654.0  913  173103.0  2017-08-04  84559.0
5130.0  NaN  754  124207.0  2016-07-03  26130.0
6170.0256.0  84397806.0  2013-02-04  87  NaN
7140.0754.095  101541.0  2016-06-08  64  447
8 80.0985.0  18484 90.0  2019-03-05  11284.6
9 96.0 65.0  127  130421.0  2014-05-14  34  NaN

下面的代码是我尝试的代码。

已尝试代码:

import pandas as pd

import numpy as np




df = pd.DataFrame({"ID":[12,96,20,73,84,26,87,64,11,34],
"y_2014": [100,120,np.nan,180,110,130,170,140,80,96],
"y_2015": [122,159,164,421,654,np.nan,256,754,985,65],
"y_2016": [324,54,687,512,913,754,843,95,184,127],
 
"y_2017": [632,452,165,184,173,124,97,101,84,130],
"y_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)



# 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)

print(df)

-> ValueError: Lengths must match to compare


推荐答案

已解决:我自己的问题有一个可能的答案

import pandas as pd

import numpy as np



df = pd.DataFrame({"ID":[12,96,20,73,84,26,87,64,11,34],
"y_2014": [100,120,np.nan,180,110,130,170,140,80,96],

"y_2015": [122,159,164,421,654,np.nan,256,754,985,65],
"y_2016": [324,54,687,512,913,754,843,95,184,127],
"y_2017": [632,452,165,184,173,124,97,101,84,130],
"y_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']})

#Subset from original df to calculate mean
subset = df.loc[:,['y_2014', 'y_2015', 'y_2016', 'y_2017', 'y_2018']]


#an expense value is only available for the calculation of the mean when that year has passed, therefore 2015-01-01 is chosen for the 'y_2014' column in the subset etc. to check with the 'Date'-column
subset.columns = ['2015-01-01', '2016-01-01', '2017-01-01', '2018-01-01', '2019-01-01']


s = subset.columns[0:].values < df.Date.values[:,None]

t = s.astype(float)
t[t == 0] = np.nan


df['mean'] = (subset.iloc[:,0:]*t).mean(1)


print(df)

#Additionally: (gives the sum of expenses before a certain date in the 'Date'-column
df['sum'] = (subset.iloc[:,0:]*t).sum(1)


print(df)


好了关于在特定日期时间之前出现的列中数据的Pandas DataFrame平均值的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。