第三章——分组

问题与练习

1. 问题

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

  • 前向填充
df = pd.DataFrame([[np.nan, 2, np.nan, 0],
                   [3, 4, np.nan, 1],
                   [np.nan, np.nan, np.nan, 5],
                   [np.nan, 3, np.nan, 4]],
                  columns=list('ABCD'))
df

第三章——分组_第1张图片

df.fillna(method='ffill')

第三章——分组_第2张图片

  • 后向填充
df.fillna(method='bfill')

第三章——分组_第3张图片

【问题二】 下面的代码实现了什么功能?请仿照设计一个它的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分位数?要求显示在同一张表上。

df = pd.read_csv('joyful-pandas-master/data/table.csv',index_col='ID')
df.head()

第三章——分组_第4张图片

df1 = df[['Math','Class']]
def q_25(x):
    return x.quantile(0.25)
def q_75(x):
    return x.quantile(0.75)
df1.groupby('Class')['Math'].agg(q_25 = pd.NamedAgg(column = 'col1',aggfunc = q_25 ),q_75 = pd.NamedAgg(column = 'col2',aggfunc = q_75))

第三章——分组_第5张图片

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

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

  • 整合—>输入一组数,输出一个数
  • 变换—>输入与输出shape相同
  • 过滤----->输入的是好几组数据,输出的是返回条件的组

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

2. 练习

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

第三章——分组_第6张图片

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

x1 = pd.read_csv('data/Diamonds.csv')
x1[x1['carat']>1]['price'].agg(lambda x:x.max()-x.min())  # 17561

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

bins = [0,x1['depth'].quantile(0.2),x1['depth'].quantile(0.4),x1['depth'].quantile(0.6),x1['depth'].quantile(0.8),x1['depth'].max()]
cuts = pd.cut(x1['depth'],bins=bins)
x1['cuts'] = cuts
result1 = x1.set_index('cuts').sort_index().groupby('cuts')['color'].describe()
result1

第三章——分组_第7张图片

x1['均重价格']=x1['price']/x1['carat']
result1['top'] == [i[1] for i in x1.groupby(['cuts'
                                ,'color'])['均重价格'].mean().groupby(['cuts']).idxmax().values]

第三章——分组_第8张图片

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

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

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

第三章——分组_第9张图片

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

x2 = pd.read_csv('data/Drugs.csv')
x2.groupby(['YYYY','COUNTY'])['DrugReports'].sum()

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

你可能感兴趣的:(第三章——分组)