如何在Pandas中对组进行分析

时间:2015-10-31 06:16:02

标签: python pandas

我有一个汽车数据集。数据集包含汽车的品牌(品牌),汽车的型号名称,制造年份和当前市场价格。

|Make|Model|mfgYear|price
|Audi| A4  | 2007  |3429999
|Audi| A5  | 2008  |2900000
|Audi| A5  | 2009  |3000000
|Audi| A4  | 2011  |4000000
.......

我想知道,对于每个制造模型组合(或制造模型组),每年价格下降的平均速率是多少。例如。如果这个小组是make-> Ford,model-> Focus,我想知道随着汽车老化,市场价格下降的速度。

以下代码执行分组并显示前两个组的外观。

gb = df.groupby(['make','model'])
for (name, group),i in zip(gb,range(3)):
    print name
    print group


('Audi', 'A3')
    |make |model  |mfgYear |  price
19  |Audi |   A3  |  2014  |3300000

('Audi', 'A4')
     |make| model | mfgYear  |  price
20   |Audi|    A4 |    2014  |3100000
406  |Audi|    A4 |    2012  |1799000

任何帮助将不胜感激。我认为这个问题可能属于聚类分析的范畴,但我对它不太确定。

我的目标是......

|Make|Model|averageAnnualDepreciation
|Audi| A4  | <average of (priceCorrespondingToMostRecentYear - price)/(mostRecentYear - year)>
|Audi| A5  | <average of (priceCorrespondingToMostRecentYear - price)/(mostRecentYear - year)>
....

2 个答案:

答案 0 :(得分:0)

这两组中的每一组,别名为“group&#39;在for循环中,是数据帧。对于每个组 - 即对于每个数据帧 - 我做的是......

  1. 按降序排序mfgYear。
  2. 将第一个mfgYear固定为基准年,并将相应的价格固定为基准价格。
  3. 将一个函数应用于数据框的每个后续行,这些行将提供相对于基准年基本价格的折旧。这应该放在一个集合或列表中。 used group.apply()
  4. 平均上述集合中的值。
  5. 我构建了一个单独的数据框,其中一列为&#34; make&#34;,另一列为&#34; model&#34;,第三个&#34;平均每年折旧&#34;。这真正归结为如何将函数顺序应用于数据帧的行。

    df_result = pd.DataFrame()
    gb = df.groupby(['make','model'])
    for (name, group),i in zip(gb,range(3)):
        print name
        gp1 = group.groupby('mfgYear').mean() # This gives the mean price of every year
        gp1 = gp1.sort_index(ascending=False)
        depreciations = gp1.apply(<func for cal. depreciations>)
        data = {}
        data['make-model'],data['annualDepreciation'] = name,depreciations.mean()
        df_result.append(data,ignore_index=True)
    

答案 1 :(得分:0)

对于此DataFrame:

   Make  Model  mfgYear    price
0  Audi   A4       2007  3429999
1  Audi   A5       2008  2900000
2  Audi   A5       2009  3000000
3  Audi   A4       2011  4000000
4  Audi   A5       2007  2500000
5  Audi   A4       2010  3200000

我分组:

gb = df.groupby(['Make','Model'])

现在我可以应用一个函数:

def avg(group):
    year = group['mfgYear']
    price = group['price']
    last_year = year.max()
    last_price = price[year == last_year]
    other_prices = price[year != last_year]
    other_years = year[year != last_year]
    down = ((last_price.values - other_prices) / 
             (last_year - other_years)).sum() / len(other_years)
    return down

gb.apply(avg)

给出了这个结果:

Make  Model
Audi   A4      471250.125
       A5      175000.000
dtype: float64

这与手工计算的A4的数字相对应:

((4000000 - 3200000) + (4000000 - 3429999) / 4) / 2
471250.125