Pandas-D3分组

一、整体构架

在这里插入图片描述

二、问题与练习

1. 问题

【问题一】 什么是fillna的前向/后向填充,如何实现?

#向前填充
fillna(method='ffill')
#向后填充
fillna(method='bfill')

【问题二】 下面的代码实现了什么功能?请仿照设计一个它的groupby版本。

s = pd.Series ([0, 1, 1, 0, 1, 1, 1, 0])
s1 = s.cumsum()
result = s.mul(s1).diff().where(lambda x: x < 0).ffill().add(s1,fill_value =0)

【问题三】 如何计算组内0.25分位数与0.75分位数?要求显示在同一张表上。

def R1(x):
	return np.percentile(x,25)
def R2(x):
	return np.percentile(x,75)
print(grouped_single.agg(percentile_25=pd.NamedAgg(column='Math,aggfunc=R1),percentile_75=pd.NamedAgg(column='Math,aggfunc=R2)))

【问题四】 既然索引已经能够选出某些符合条件的子集,那么filter函数的设计有什么意义?

  • 可以过滤出更大的整体子集

【问题五】 整合、变换、过滤三者在输入输出和功能上有何异同?

  • 聚合针对每个组
  • 变换针对组内对象
  • 过滤针对筛选组

【问题六】 在带参数的多函数聚合时,有办法能够绕过wrap技巧实现同样功能吗?

2. 练习

【练习一】: 现有一份关于diamonds的数据集,列分别记录了克拉数、颜色、开采深度、价格,请解决下列问题:

pd.read_csv('data/Diamonds.csv').head()

(a) 在所有重量超过1克拉的钻石中,价格的极差是多少?

(b) 若以开采深度的0.2\0.4\0.6\0.8分位数为分组依据,每一组中钻石颜色最多的是哪一种?该种颜色是组内平均而言单位重量最贵的吗?

© 以重量分组(0-0.5,0.5-1,1-1.5,1.5-2,2+),按递增的深度为索引排序,求每组中连续的严格递增价格序列长度的最大值。

(d) 请按颜色分组,分别计算价格关于克拉数的回归系数。(单变量的简单线性回归,并只使用Pandas和Numpy完成)

df = pd.read_csv('F:\python入门\joyful-pandas-master\data/Diamonds.csv')
print(df.head())

#选出克拉数>1的
df_j = df.groupby('carat')
df_jc = df_j[['carat','price']].filter(lambda x:(x['carat']>1).all())
print(df_jc.head())

print('----(a)符合题目要求的价格极差-----')
jc = df_jc['price'].agg(lambda x:x.max()-x.min())
print(jc)

'''
     carat  price
172   1.17   2774
215   1.01   2781
241   1.01   2788
242   1.01   2788
247   1.05   2789
----(a)符合题目要求的价格极差-----
17561
'''
bins = df['depth'].quantile(np.linspace(0,1,6)).tolist()
cuts = pd.cut(df['depth'],bins=bins)
df['cuts'] = cuts
print(df.head())
print('----------------------------------------')
color_rest = df.groupby('cuts')['color'].describe()
print(color_rest)

df['均重价格'] = df['price']/df['carat']
print('-------------打印结果-----------------------')
print(color_rest['top'] == [i[1] for i in df.groupby(['cuts','color'])['均重价格'].mean().groupby(['cuts']).idxmax().values])
'''
   carat color  depth  price          cuts
0   0.23     E   61.5    326  (60.8, 61.6]
1   0.21     E   59.8    326  (43.0, 60.8]
2   0.23     E   56.9    327  (43.0, 60.8]
3   0.29     I   62.4    334  (62.1, 62.7]
4   0.31     J   63.3    335  (62.7, 79.0]
----------------------------------------
              count unique top  freq
cuts                                
(43.0, 60.8]  11294      7   E  2259
(60.8, 61.6]  11831      7   G  2593
(61.6, 62.1]  10403      7   G  2247
(62.1, 62.7]  10137      7   G  2193
(62.7, 79.0]  10273      7   G  2000
-------------打印结果-----------------------
cuts
(43.0, 60.8]    False
(60.8, 61.6]    False
(61.6, 62.1]    False
(62.1, 62.7]     True
(62.7, 79.0]     True
Name: top, dtype: bool
'''

【练习二】:有一份关于美国10年至17年的非法药物数据集,列分别记录了年份、州(5个)、县、药物类型、报告数量,请解决下列问题:

pd.read_csv('data/Drugs.csv').head()

(a) 按照年份统计,哪个县的报告数量最多?这个县所属的州在当年也是报告数最多的吗?

(b) 从14年到15年,Heroin的数量增加最多的是哪一个州?它在这个州是所有药物中增幅最大的吗?若不是,请找出符合该条件的药物。

df = pd.read_csv('F:\python入门\joyful-pandas-master\data/Drugs.csv')
print(df.head())
print('===============================================================')
idx = pd.IndexSlice
for i in range(2010,2018):
    county = (df.groupby(['COUNTY','YYYY']).sum().loc[idx[:,i],:].idxmax()[0][0])
    state = df.query('COUNTY == "%s"'%county)['State'].iloc[0]
    state_true = df.groupby(['State','YYYY']).sum().loc[idx[:,i],:].idxmax()[0][0]
    if state==state_true:
        print('在%d年,%s县的报告数最多,它所属的州%s也是报告数最多的'%(i,county,state))
    else:
        print('在%d年,%s县的报告数最多,但它所属的州%s不是报告数最多的,%s州报告数最多'%(i,county,state,state_true))


'''
   YYYY State           COUNTY  SubstanceName  DrugReports
0  2010    VA         ACCOMACK   Propoxyphene            1
1  2010    OH            ADAMS       Morphine            9
2  2010    PA            ADAMS      Methadone            2
3  2010    VA  ALEXANDRIA CITY         Heroin            5
4  2010    PA        ALLEGHENY  Hydromorphone            5
===============================================================
在2010年,PHILADELPHIA县的报告数最多,它所属的州PA也是报告数最多的
在2011年,PHILADELPHIA县的报告数最多,但它所属的州PA不是报告数最多的,OH州报告数最多
在2012年,PHILADELPHIA县的报告数最多,但它所属的州PA不是报告数最多的,OH州报告数最多
在2013年,PHILADELPHIA县的报告数最多,但它所属的州PA不是报告数最多的,OH州报告数最多
在2014年,PHILADELPHIA县的报告数最多,但它所属的州PA不是报告数最多的,OH州报告数最多
在2015年,PHILADELPHIA县的报告数最多,但它所属的州PA不是报告数最多的,OH州报告数最多
在2016年,HAMILTON县的报告数最多,它所属的州OH也是报告数最多的
在2017年,HAMILTON县的报告数最多,它所属的州OH也是报告数最多的
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值