-
导入pandas
- 将pandas以pd的名字引入
import pandas
- 查看导入的pandas的版本
pd.version
- 打印出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']
- 创建索引为labels的数据框df
df = pd.DataFrame(data=data,index=labels)
- 展示df基础信息和它的数据
df.describe()
- 返回df的前三行
df.head(3)
- 只选择 'animal' 和'age' 列
df[['animal','age']]
- 选择['animal', 'age']的 [3, 4, 8]行
df.loc[df.index[[3,4,8]],['animal','age']]
- 选择visits大于 2的数据
df.query('visits > 2')
- 选择有缺失值的行, i.e. is NaN.
df[df['age'].isnull()]
- 选择 animal 是cat和age小于3.
df.query('animal=="cat" and age < 3') # 单=是赋值,双==才是判别
- 选择 age is between 2 and 4 (inclusive)的行
df.query('age>= 2 and age<=4')
- 将age里的'f'改成1.5.
df.loc['f','age'] = 1.5
- 计算visits的和 (the total number of visits).
df['visits'].sum()
- 计算每一个动物的平均年龄
df.groupby(by='animal')['age'].mean()
- 添加新的一行 'k' ,数据自己填,然后再将此行删除返回原数据框
df.loc['k'] = [5,'dog',2,'no']
df = df.drop('k')
df
- 对每个动物的数量进行计数
df['animal'].value_counts()
- 对df按照age降序、visit升序进行排序
df.sort_values(by=['age','visits'],ascending=[False,True])
- 'priority' 列包含值 'yes' 和'no'. 使用布尔值对这列进行替换: 'yes' 替换成 True , 'no' 替换成 False.
df['priority'] = df['priority'].map({'yes': True, 'no': False})
df
- 在'animal' 列, 将'snake' 替换成 'python'.
df['animal']=df['animal'].replace('snake','python')
df
- 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')
- 给定一个由数值型数据组成的数据框:
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)
- 给定一个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()
- 如何计算一个数据框有多少个唯一的行(即忽略所有重复的行)?
len(df.drop_duplicates(keep=False))
- 给定一个由10列浮点数组成的数据框。假设每行中只有5个条目是NaN值。对于数据帧的每一行,查找包含第三个NaN值的列。
(You should return a Series of column labels.)
(df.isnill().cumsum(axis=1)==3).idxmax(axis=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
- 创建一个包含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()
- 找到每个星期三的s值之和。
s[s.index.weekday == 2].sum()
35.对于s中的每个日历月,查找值的平均值。
s.resample('M').mean()
- 对于每一组连续四个日历月(s),找出出现最高值的日期。
s.groupby(pd.Grouper(freq='4M')).idxmax()
- 创建一个日期时间索引,包括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(!)', ' (12)', '(British Airways. )',
'12. Air France', '"Swiss Air"']})
- FlightNumber列中的某些值丢失。这些数字每行增加10个,因此10055和10075填充到相应位置。填写这些缺少的数字,并使列成为整型列(而不是浮点列)。
df['FlightNumber'] = df['FlightNumber'].interpolate().astype(int)
df
- 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
- 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
- 将From_To 列删除,并将之前的临时表添加进来
df = df.drop('From_To',axis=1)
df = df.join(temp)
df
- 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
- 在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
-
使用多重索引
- 给定列表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)
- 检查s的索引是否按字典顺序排序(这是索引正确使用多索引的必要条件)。
s.index.is_lexsorted()
- 从多重索引序列的第二级选择标签1、3和6。
s.loc[:,[1,3,6]]
- 对系列s进行切片;对第一个级别进行切片,直至标签“B”,对第二个级别进行切片,从标签5开始。
s.loc[pd.IndexSlice[:'B', 5:]]
- 为第一个级别中的每个标签求和s中的值(您应该让序列为标签a、b和c求和)。
s.sum(level=0)
- 假设sum()(和其他方法)不接受level关键字参数。另外,如何执行s.sum的等效值(级别=1)
s.unstack().sum(axis=0)
- 交换多索引的级别,这样我们就有了一个形式的索引(字母、数字)。这个新系列的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")
- 数据框中的列也可用于修改颜色和大小。随着时间的推移,比尔一直在跟踪自己在工作中的表现,以及那天感觉有多好,以及早上是否喝了一杯咖啡。绘制一个包含此数据帧所有四个功能的绘图。
(提示:如果您在查看绘图时遇到问题,请尝试将您选择表示大小的序列乘以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)
- 如果我们想画出多个东西怎么办?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