[Pandas Day3]分组

1.什么是fillna的前向/后向填充,如何实现?

参数:method
说明:插值方式。如果函数调用时未指定其他参数的话,默认为“ffill”

向前和向后填充,使用 ffill和 bfill
fillna(method='ffill')
fillna(method='bfill')

2.下面的代码实现了什么功能?请仿照设计一个它的groupby版本。

# 1  首先求出累计和 [0,1,2,2,3,4,5,5]
# 2  再进行差分操作[]
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)

# 2

3.如何计算组内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)))

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

根据要求过滤出更大的整体子集。

5.整合、变换、过滤三者在输入输出和功能上有何异同?

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

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

ex 3-1

import numpy as np
import pandas as pd

df = pd.read_csv('data/Diamonds.csv')
print(df.head())

# 在所有重量超过1克拉的钻石中,价格的极差是多少?
df_r = df.query('carat>1')['price']
df_d = df_r.max()-df_r.min()
print(df_d)

# 若以开采深度的0.2\0.4\0.6\0.8分位数为分组依据,每一组中钻石颜色最多的是哪一种?该种颜色是组内平均而言单位重量最贵的吗?
bins = df['depth'].quantile(np.linspace(0,1,6)).tolist()
cuts = pd.cut(df['depth'],bins=bins) #可选label添加自定义标签
df['cuts'] = cuts
# print(df.head())

color_result = df.groupby('cuts')['color'].describe()
# print(color_result)

#  以重量分组(0-0.5,0.5-1,1-1.5,1.5-2,2+),按递增的深度为索引排序,求每组中连续的严格递增价格序列长度的最大值。
df['均重价格']=df['price']/df['carat']
print(color_result['top'] == [i[1] for i in df.groupby(['cuts','color'])['均重价格'].mean().groupby(['cuts']).idxmax().values])
df = df.drop(columns='均重价格')
cuts = pd.cut(df['carat'],bins=[0,0.5,1,1.5,2,np.inf]) #可选label添加自定义标签
df['cuts'] = cuts
# print(df.head())

def f(nums):
    if not nums:
        return 0
    res = 1
    cur_len = 1
    for i in range(1, len(nums)):
        if nums[i-1] < nums[i]:
            cur_len += 1
            res = max(cur_len, res)
        else:
            cur_len = 1
    return res

for name,group in df.groupby('cuts'):
    group = group.sort_values(by='depth')
    s = group['price']
    print(name,f(s.tolist()))

# 请按颜色分组,分别计算价格关于克拉数的回归系数。(单变量的简单线性回归,并只使用Pandas和Numpy完成)
for name,group in df[['carat','price','color']].groupby('color'):
    L1 = np.array([np.ones(group.shape[0]),group['carat']]).reshape(2,group.shape[0])
    L2 = group['price']
    result = (np.linalg.inv(L1.dot(L1.T)).dot(L1)).dot(L2).reshape(2,1)
    print('当颜色为%s时,截距项为:%f,回归系数为:%f'%(name,result[0],result[1]))

ex 3-1

import numpy as np
import pandas as pd

df = pd.read_csv('data/Drugs.csv')
print(df.head())

# 按照年份统计,哪个县的报告数量最多?这个县所属的州在当年也是报告数最多的吗
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))

# 从14年到15年,Heroin的数量增加最多的是哪一个州?它在这个州是所有药物中增幅最大的吗?若不是,请找出符合该条件的药物。
df_b = df[(df['YYYY'].isin([2014,2015]))&(df['SubstanceName']=='Heroin')]
df_add = df_b.groupby(['YYYY','State']).sum()
print((df_add.loc[2015]-df_add.loc[2014]).idxmax())

df_b = df[(df['YYYY'].isin([2014,2015]))&(df['State']=='OH')]
df_add = df_b.groupby(['YYYY','SubstanceName']).sum()
print((df_add.loc[2015]-df_add.loc[2014]).idxmax()) #这里利用了索引对齐的特点
print((df_add.loc[2015]/df_add.loc[2014]).idxmax())

数据&代码

参考博客

https://blog.csdn.net/teacoffeetea/article/details/105736245
https://blog.csdn.net/laicikankna/article/details/105700793
https://zhuanlan.zhihu.com/p/134613342

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值