pandas练习

  • 导入pandas

  1. 将pandas以pd的名字引入

import pandas

  1. 查看导入的pandas的版本

pd.version

  1. 打印出pandas库需要的库的所有版本信息

pd.show_versions()

  • 数据库基础

    一些基础的选择、排序、添加、聚合数据的方法
import numpy as  np
data = {'animal': ['cat', 'cat', 'snake', 'dog', 'dog', 'cat', 'snake', 'cat', 'dog', 'dog'],
        'age': [2.5, 3, 0.5, np.nan, 5, 2, 4.5, np.nan, 7, 3],
        'visits': [1, 3, 2, 3, 2, 3, 1, 1, 2, 1],
        'priority': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'no']}

labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
  1. 创建索引为labels的数据框df

df = pd.DataFrame(data=data,index=labels)

  1. 展示df基础信息和它的数据

df.describe()

  1. 返回df的前三行

df.head(3)

  1. 只选择 'animal' 和'age' 列

df[['animal','age']]

  1. 选择['animal', 'age']的 [3, 4, 8]行

df.loc[df.index[[3,4,8]],['animal','age']]

  1. 选择visits大于 2的数据

df.query('visits > 2')

  1. 选择有缺失值的行, i.e. is NaN.

df[df['age'].isnull()]

  1. 选择 animal 是cat和age小于3.

df.query('animal=="cat" and age < 3') # 单=是赋值,双==才是判别

  1. 选择 age is between 2 and 4 (inclusive)的行

df.query('age>= 2 and age<=4')

  1. 将age里的'f'改成1.5.

df.loc['f','age'] = 1.5

  1. 计算visits的和 (the total number of visits).

df['visits'].sum()

  1. 计算每一个动物的平均年龄

df.groupby(by='animal')['age'].mean()

  1. 添加新的一行 'k' ,数据自己填,然后再将此行删除返回原数据框

df.loc['k'] = [5,'dog',2,'no']
df = df.drop('k')
df

  1. 对每个动物的数量进行计数

df['animal'].value_counts()

  1. 对df按照age降序、visit升序进行排序

df.sort_values(by=['age','visits'],ascending=[False,True])

  1. 'priority' 列包含值 'yes' 和'no'. 使用布尔值对这列进行替换: 'yes' 替换成 True , 'no' 替换成 False.

df['priority'] = df['priority'].map({'yes': True, 'no': False})
df

  1. 在'animal' 列, 将'snake' 替换成 'python'.

df['animal']=df['animal'].replace('snake','python')
df

  1. For each animal type and each number of visits, find the mean age. In other words, each row is an animal, each column is a number of visits and the values are the mean ages (hint: use a pivot table).

df.pivot_table(values='age',index='animal',columns='visits',aggfunc='mean')

  • 数据框:超越基础

你可能需要结合使用两个或者更多的方法去得到正确的答案
22.你有一个含整数列‘A’的数据框 。 比如:
df = pd.DataFrame({'A': [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7]})
How do you filter out rows which contain the same integer as the row immediately above?

df = pd.DataFrame({'A': [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7]})
df.drop_duplicates(subset='A',keep='first')

  1. 给定一个由数值型数据组成的数据框:
    df = pd.DataFrame(np.random.random(size=(5, 3)))
    # a 5x3 frame of float values
    如何从行中的每个元素中减去行的平均值?

df = pd.DataFrame(np.random.random(size=(5, 3)))
df.sub(df.mean(axis=1),axis=0)

  1. 给定一个10列由数值组成的数据框:
    df = pd.DataFrame(np.random.random(size=(5, 10)), columns=list('abcdefghij'))
    哪一列的总和最小? (找出那一列的标签。)

df = pd.DataFrame(np.random.random(size=(5, 10)), columns=list('abcdefghij'))
df.sum().idxmin()

  1. 如何计算一个数据框有多少个唯一的行(即忽略所有重复的行)?

len(df.drop_duplicates(keep=False))

  1. 给定一个由10列浮点数组成的数据框。假设每行中只有5个条目是NaN值。对于数据帧的每一行,查找包含第三个NaN值的列。
    (You should return a Series of column labels.)

(df.isnill().cumsum(axis=1)==3).idxmax(axis=1)

  1. 数据框有一列组“grps”和一列数字“vals”。比如:
    df = pd.DataFrame({'grps': list('aaabbcaabcccbbc'),
    'vals': [12,345,3,1,45,14,4,52,54,23,235,21,57,3,87]})
    对于每个组,找出三个最大值的总和。

df = pd.DataFrame({'grps': list('aaabbcaabcccbbc'),
'vals': [12,345,3,1,45,14,4,52,54,23,235,21,57,3,87]})
df.groupby(by='grps')['vals'].nlargest(3).sum(level=0)

28.数据框有两个整数列“a”和“b”。“a”中的值介于1和100之间(包括1和100)。对于“a”中的每组10个连续整数(即(0,10),(10,20),…),计算“b”列中相应值的总和。

df.groupby(pd.cut(df['A'],b ins=np.arange(0,101,10)))['B'].sum()

29~32 hard部分先pass

  • Series and DatetimeIndex

  1. 创建一个包含2015年每个工作日的datetimeindex,并使用它为一系列随机数编制索引。我们称之为s系列。

time_index = pd.date_range('2015-01-01','2015-12-31',freq='B')
s = pd.Series(np.random.rand(len(time_index)),index=time_index)
s.head()

  1. 找到每个星期三的s值之和。

s[s.index.weekday == 2].sum()
35.对于s中的每个日历月,查找值的平均值。
s.resample('M').mean()

  1. 对于每一组连续四个日历月(s),找出出现最高值的日期。

s.groupby(pd.Grouper(freq='4M')).idxmax()

  1. 创建一个日期时间索引,包括2015年和2016年每月的第三个星期四。

pd.date_range('2015-01-01', '2016-12-31', freq='WOM-3THU')

  • 清洗数据

df = pd.DataFrame({'From_To': ['LoNDon_paris', 'MAdrid_miLAN', 'londON_StockhOlm', 
                               'Budapest_PaRis', 'Brussels_londOn'],
              'FlightNumber': [10045, np.nan, 10065, np.nan, 10085],
              'RecentDelays': [[23, 47], [], [24, 43, 87], [13], [67, 32]],
                   'Airline': ['KLM(!)', '<Air France> (12)', '(British Airways. )', 
                               '12. Air France', '"Swiss Air"']})
  1. FlightNumber列中的某些值丢失。这些数字每行增加10个,因此10055和10075填充到相应位置。填写这些缺少的数字,并使列成为整型列(而不是浮点列)。

df['FlightNumber'] = df['FlightNumber'].interpolate().astype(int)
df

  1. The From_To column would be better as two separate columns! Split each string on the underscore delimiter _ to give a new temporary DataFrame with the correct values. Assign the correct column names to this temporary DataFrame.

temp = df['From_To'].str.split('_',expand=True)
temp.columns = ['from','to']
temp

  1. Notice how the capitalisation of the city names is all mixed up in this temporary DataFrame. Standardise the strings so that only the first letter is uppercase (e.g. "londON" should become "London".)

temp['from'].str.title()
temp['to'].str.title()
temp

  1. 将From_To 列删除,并将之前的临时表添加进来

df = df.drop('From_To',axis=1)
df = df.join(temp)
df

  1. In the Airline column, you can see some extra puctuation and symbols have appeared around the airline names. Pull out just the airline name. E.g. '(British Airways. )' should become 'British Airways'.在Airline列中,您可以看到一些额外的解释和符号出现在airline名称周围。把航空公司的名字拉出来。例如,“(British Airways. )”应该成为“British Airways”。

df['Airline'] = df['Airline'].str.extract('([a-zA-Z\s]+)',expand=False).str.strip()
df

  1. 在RecentDelays列中,值已作为列表输入到数据框中。我们希望每个第一个值位于它自己的列中,每个第二个值位于它自己的列中,依此类推。如果没有第n个值,则该值应为NaN。
    将一系列列表扩展到名为delays的数据框中,重命名delay_1、delay_2等列,并用delays替换df中不需要的recentdelays列。

delays = df['RecentDelays'].apply(pd.Series)
delays.columns = ['delay_{}'.format(n) for n in range(1, len(delays.columns)+1)]
df = df.drop('RecentDelays', axis=1).join(delays)
df

  • 使用多重索引

  1. 给定列表letters=['a'、'b'、'c']和numbers=list(range(10)),从两个列表的乘积构造一个多索引对象。用它来索引一系列随机数。称之为s系列。

letters = ['A', 'B', 'C']
numbers = list(range(10))
mi = pd.MultiIndex.from_product([letters, numbers])
s = pd.Series(np.random.rand(30), index=mi)

  1. 检查s的索引是否按字典顺序排序(这是索引正确使用多索引的必要条件)。

s.index.is_lexsorted()

  1. 从多重索引序列的第二级选择标签1、3和6。

s.loc[:,[1,3,6]]

  1. 对系列s进行切片;对第一个级别进行切片,直至标签“B”,对第二个级别进行切片,从标签5开始。

s.loc[pd.IndexSlice[:'B', 5:]]

  1. 为第一个级别中的每个标签求和s中的值(您应该让序列为标签a、b和c求和)。

s.sum(level=0)

  1. 假设sum()(和其他方法)不接受level关键字参数。另外,如何执行s.sum的等效值(级别=1)

s.unstack().sum(axis=0)

  1. 交换多索引的级别,这样我们就有了一个形式的索引(字母、数字)。这个新系列的lexsorted正确吗?如果没有,请排序。

new_s = s.swaplevel(0, 1)
new_s = new_s.sort_index()

  • 绘图

51.pandas与绘图库Matplotlib高度集成,使绘图数据框非常友好!在笔记本电脑环境中绘图通常使用以下样板:
将matplotlib.pyplot导入为plt
%matplotlib内联
plt.style.use('ggplot')
matplotlib是pandas绘图功能所基于的绘图库,通常别名为plt。
%matplotlib inline告诉笔记本以内联方式显示绘图,而不是在单独的窗口中创建它们。
plt.style.use(“ggplot”)是一个大多数人都认为合适的风格主题,基于r的ggplot包的样式。
首先,对这些随机数据绘制一个散点图,但使用黑色的X而不是默认标记。
df=pd.dataframe(“xs”:[1,5,2,8,1],“ys”:[4,2,1,9,6])
如果卡住,请查阅文档!

 import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('ggplot')
import pandas as pd
import numpy as np

df = pd.DataFrame({"xs":[1,5,2,8,1], "ys":[4,2,1,9,6]})
df.plot.scatter("xs", "ys", color = "black", marker = "x")

  1. 数据框中的列也可用于修改颜色和大小。随着时间的推移,比尔一直在跟踪自己在工作中的表现,以及那天感觉有多好,以及早上是否喝了一杯咖啡。绘制一个包含此数据帧所有四个功能的绘图。
    (提示:如果您在查看绘图时遇到问题,请尝试将您选择表示大小的序列乘以10或更多)

df = pd.DataFrame({"productivity":[5,2,3,1,4,5,6,7,8,3,4,8,9],
"hours_in" :[1,9,6,5,3,9,2,9,1,7,4,2,2],
"happiness" :[2,1,3,2,3,1,2,3,1,2,2,1,3],
"caffienated" :[0,0,1,1,0,0,0,0,1,1,0,1,0]})

df.plot.scatter("hours_in", "productivity", s = df.happiness * 30, c = df.caffienated)

  1. 如果我们想画出多个东西怎么办?pandas允许您为绘图传入matplotlib轴对象,绘图也将返回一个轴对象。
    用每月广告支出的线图制作每月收入的条形图(以百万计)

df = pd.DataFrame({"revenue":[57,68,63,71,72,90,80,62,59,51,47,52],
"advertising":[2.1,1.9,2.7,3.0,3.6,3.2,2.7,2.4,1.8,1.6,1.3,1.9],
"month":range(12)
})
ax = df.plot.bar("month", "revenue", color = "green")
df.plot.line("month", "advertising", secondary_y = True, ax = ax)
ax.set_xlim((-1,12))

练习地址:https://github.com/ajcr/100-pandas-puzzles/blob/master/100-pandas-puzzles.ipynb

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

推荐阅读更多精彩内容

  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,457评论 0 13
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,336评论 0 10
  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 9,511评论 0 23
  • 又一个终点即起点的时刻到来了。 一、52号学员Vivian的鱼骨图作业。 首先蓝黄两色让整幅作品的画面很清爽吸睛,...
    lilycat阅读 168评论 0 0
  • 早晨醒来,揉着惺忪的睡眼拉开窗帘,阳光透过鱼缸,看着鱼儿的影子在墙面上游弋。 是的,这是初出社会时那个少年设想过的...
    郭小猛阅读 314评论 0 0