我们如何使用熊猫生成最小,最大,平均值,中位数......作为数据框的新列?

问题描述:

我只是拿起熊猫。我有一个数据帧如下:我们如何使用熊猫生成最小,最大,平均值,中位数......作为数据框的新列?

 DEST MONTH PRICE SOUR  TYPE YEAR 
0 DEST7  8 159 SOUR4 WEEKEND 2015 
1 DEST2  9 391 SOUR1 WEEKEND 2010 
2 DEST5  5 612 SOUR1 WEEKDAY 2013 
3 DEST4  10 836 SOUR4 WEEKEND 2013 
4 DEST4  4 689 SOUR3 WEEKEND 2013 
5 DEST7  3 862 SOUR4 WEEKDAY 2014 
6 DEST4  5 483 SOUR4 WEEKEND 2016 
7 DEST2  2 489 SOUR3 WEEKEND 2017 
8 DEST4  7 207 SOUR1 WEEKDAY 2012 
9 DEST3  11 374 SOUR2 WEEKDAY 2015 
10 DEST1  2 959 SOUR2 WEEKEND 2017 
11 DEST5  10 969 SOUR3 WEEKDAY 2011 
12 DEST8  3 645 SOUR4 WEEKEND 2013 
13 DEST6  7 258 SOUR4 WEEKEND 2013 
14 DEST8  5 955 SOUR4 WEEKDAY 2010 
15 DEST1  3 568 SOUR4 WEEKEND 2013 
16 DEST5  5 601 SOUR4 WEEKDAY 2016 
17 DEST1  6 159 SOUR3 WEEKDAY 2011 
18 DEST3  11 322 SOUR4 WEEKDAY 2013 
19 DEST2  10 103 SOUR2 WEEKDAY 2012 

我已经把下面的代码,随意生成自己的随机数据框:

import pandas as pd 
import random 
import numpy as np 

df= pd.DataFrame({"YEAR": np.random.choice([2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017], 20, replace=True), 
        "MONTH": np.random.choice([_ for _ in range(1, 13)], 20, replace=True), 
        "TYPE": np.random.choice(['WEEKDAY', 'WEEKEND'], 20, replace=True), 
        "SOUR": np.random.choice(['SOUR1', 'SOUR2', 'SOUR3', 'SOUR4'], 20, replace=True), 
        "DEST": np.random.choice(['DEST1', 'DEST2', 'DEST3', 'DEST4','DEST5', 'DEST6', 'DEST7', 'DEST8'], 20, replace=True), 
        "PRICE": np.random.choice([_ for _ in range(100, 999)], 20, replace=True)}) 
print(df) 

我想产生最小值,最大值,平均值,中值...作为新列,将这些列添加到数据框中。这是聚合代码我想:

aggregation={ 
     "PRICE": 
    { 
     "MIN": lambda x: x.min(skipna=True), 
     "MAX":lambda x: x.max(skipna=True), 
     "MEDIAN":lambda x: x.median(skipna=True), 
     "MEAN":lambda x:x.mean(skipna=True) 
    } 
} 

df1=df.groupby(["YEAR","MONTH","TYPE","SOUR","DEST"]).agg(aggregation).reset_index() 
df1 

但产量不计算任何最小值,最大值,中位数,是指在所有:

YEAR MONTH  TYPE SOUR DEST PRICE     
             MIN MAX MEDIAN MEAN 
0 2010  5 WEEKDAY SOUR4 DEST8 955 955 955 955 
1 2010  9 WEEKEND SOUR1 DEST2 391 391 391 391 
2 2011  6 WEEKDAY SOUR3 DEST1 159 159 159 159 
3 2011 10 WEEKDAY SOUR3 DEST5 969 969 969 969 
4 2012  7 WEEKDAY SOUR1 DEST4 207 207 207 207 
5 2012 10 WEEKDAY SOUR2 DEST2 103 103 103 103 
6 2013  3 WEEKEND SOUR4 DEST1 568 568 568 568 
7 2013  3 WEEKEND SOUR4 DEST8 645 645 645 645 
8 2013  4 WEEKEND SOUR3 DEST4 689 689 689 689 
9 2013  5 WEEKDAY SOUR1 DEST5 612 612 612 612 
10 2013  7 WEEKEND SOUR4 DEST6 258 258 258 258 
11 2013 10 WEEKEND SOUR4 DEST4 836 836 836 836 
12 2013 11 WEEKDAY SOUR4 DEST3 322 322 322 322 
13 2014  3 WEEKDAY SOUR4 DEST7 862 862 862 862 
14 2015  8 WEEKEND SOUR4 DEST7 159 159 159 159 
15 2015 11 WEEKDAY SOUR2 DEST3 374 374 374 374 
16 2016  5 WEEKDAY SOUR4 DEST5 601 601 601 601 
17 2016  5 WEEKEND SOUR4 DEST4 483 483 483 483 
18 2017  2 WEEKEND SOUR2 DEST1 959 959 959 959 
19 2017  2 WEEKEND SOUR3 DEST2 489 489 489 489 

我怎么能修改Python代码提供正确输出?谢谢。

另一个问题是,如果我想添加另一列,只计算TYPE,SOUR,DEST(不包括MONTH或YEAR)的平均价格组,如何保留TYPE组, SOUR,DEST,MONTH,YEAR?我的预期输出:

YEAR MONTH  TYPE SOUR DEST PRICE     
             MIN MAX MEDIAN MEAN AVG 
0 2010  5 WEEKDAY SOUR4 DEST8 ... ... ... ... 500 
1 2010  9 WEEKEND SOUR1 DEST2 ... ... ... ... 
2 2011  6 WEEKDAY SOUR3 DEST5 ... ... ... ... 720 
3 2011 10 WEEKDAY SOUR3 DEST5 ... ... ... ... 720 
4 2012  7 WEEKDAY SOUR1 DEST4 ... ... ... ... 
5 2012 10 WEEKDAY SOUR2 DEST2 ... ... ... ... 
6 2013  3 WEEKEND SOUR4 DEST1 ... ... ... ... 
7 2013  3 WEEKDAY SOUR4 DEST8 ... ... ... ... 500 
8 2013  4 WEEKEND SOUR3 DEST4 ... ... ... ... 
9 2013  5 WEEKDAY SOUR1 DEST5 ... ... ... ... 
10 2013  7 WEEKEND SOUR4 DEST6 ... ... ... ... 
... 
+1

您确定要分组所有这些列吗?你真的想要计算什么最小/最大/中位数/平均值?当您将所有这些列组合在一起时,您只能得到每个组的一个PRICE值,因此所有这些度量都是相同的。 – jack6e

+0

哦......你是对的......因为我的样本很小,所以每个组只包含一行......谢谢!你知道第二个问题的答案吗? –

你的代码实际上确实计算了最小值,最大值,中位数和平均值。但是,由于您在5列使用groupby。对于只有20行的所有5列包含相同值的2行几率很小。

要么增加数据量,因此groupby实际上将行组合在一起,或者一次将groupby组合在较少的列上。

要使用AVG(mean)仅添加3列作为groupby的列,请分别在第一个DataFrame上执行groupby,然后在三列上合并它们。

df1=df.groupby(["YEAR","MONTH","TYPE","SOUR","DEST"]).agg(aggregation).reset_index() 
df2=df.groupby(["TYPE", "SOUR", "DEST"]).agg({"PRICE":{ "avg" : "mean"} }).reset_index() 
df3= pd.merge(df1, df2, on=["TYPE", "SOUR", "DEST"], how='left') 
+0

这是我试图找到的答案。非常感谢Prikkel! –