一、整体构架
二、问题与练习
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也是报告数最多的
'''