Pandas 100道练习题(三)

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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354