美文网首页
Pandas 100道练习题(三)

Pandas 100道练习题(三)

作者: butters001 | 来源:发表于2020-09-28 17:06 被阅读0次

Pandas 100道练习题(三)

今天是100道练习题的第三天,明天将讲到第50题,我们就先歇一歇,学习一下别的知识点,剩下的后50题找机会继续做完。

DataFrames: harder problems

难度:困难

  1. 存在一组数据X[7, 2, 0, 3, 4, 2, 5, 0, 3, 4]生成一个新列,新列的元素为距离前一个0(包括自身数值为0)的长度。题目可能比较难懂,大家看图就知道题目是什么意思了

图解题意:


29-1.png
# 数据
df = pd.DataFrame({'X': [7, 2, 0, 3, 4, 2, 5, 0, 3, 4]})
# 答案
# 首先算出到目前为止 一共出现了几个0 由下图可知一共有三种情况
count_0 = (df['X'] == 0).cumsum()

# 根据count_0对X进行分组 可以分为3组
# 再根据 cumsum() 算出每组数据的在组内的索引(位置)
df['Y'] = df.groupby(count_0).cumcount()

# 可以看到除了第一组数据不符合预期 其他组的数据都符合预期 
# 需要对第一组的每个值都+1
# 找到第一组的结束位置,对这个位置之前的所有值都+1
first_zero_idx = (df['X'] == 0).idxmax()
df['Y'].iloc[0:first_zero_idx] += 1
29-2.jpeg
  1. 求出最大的三个值的索引位置

结果如:[(i1,c1), (i2,c2), (i3,c3)]

df = pd.DataFrame(np.random.RandomState(30).randint(1, 101, size=(8, 8)))
# 思路 可以将columns转为index 生成多层索引的Series
df.unstack().sort_values()[-3:].index.tolist()
30.jpeg
  1. 有如下数据,生成一个新列patched_values,当vals为正数时patched_value的值等于vals,当vals为负数时,patched_value的值等于所在组的正数的平均值
df = pd.DataFrame({"vals": np.random.RandomState(31).randint(-30, 30, size=15), 
                   "grps": np.random.RandomState(31).choice(["A", "B"], 15)})
def helper(group):
    group[group<0] = group[group>=0].mean()
    return group

# 根据grps进行分组,将每组内的负数换成这个组正数的平均值
df['patched_vals'] = df.groupby('grps')['vals'].transform(helper)
31.png
  1. 对窗口大小为3的组实施滚动均值,忽略NaN值
df = pd.DataFrame({'group': list('aabbabbbabab'),
                   'value': [1, 2, 3, np.nan, 2, 3, np.nan, 1, 7, 3, np.nan, 8]})
32.png
# 按group进行分组
g1 = df.groupby(['group'])['value']  

# 缺失值填充为0
g2 = df.fillna(0).groupby(['group'])['value']

# 组内窗口为3的和/组内窗口为3的非NaN的个数
s = g2.rolling(3, min_periods=1).sum() / g1.rolling(3, min_periods=1).count()

# 重置索引
s.reset_index(level=0, drop=True).sort_index()
DataFrames: harder problems

难度:简单/中等

  1. 创建一个Series,索引为2015年内的工作日,值自定义随机数
dt_index = pd.date_range(start='2015-01-01', end='2015-12-31', freq='B') 
s = pd.Series(np.random.rand(len(dt_index)), index=dt_index)
33.png
  1. 计算日期是周三(Wednesday)的值的和
s[s.index.weekday == 2].sum()
  1. 计算每个月的均值
s.resample('M').mean()
35.png
  1. 四个连续月的为一组,找到每组内最大值对应的日期
s.groupby(pd.Grouper(freq='4M')).idxmax()
36.png
  1. 创建一个DateTimeIndex,其中包含2015年到2016年每个月的第三个星期四
pd.date_range('2015/1/1', '2016/12/31', freq='WOM-3THU')
37.png

相关文章

网友评论

      本文标题:Pandas 100道练习题(三)

      本文链接:https://www.haomeiwen.com/subject/aqxjuktx.html