part 21 - part 30 笔记-入门课完结
part 21 减少内存技巧
import pandas as pd
drinks = pd.read_csv(‘文件路径’)
查看文件相关信息,数据类型,
各列的数据类型,是否有缺失,内存使用情况
drinks.info(memory_usage=‘deep’)
查看各列内存使用
drinks.memory_usage(deep=True)
计算使用总内存
drinks.memory_usage(deep=True).sum
将指定列数据类型设置为category,
减少内存使用,计算成本
将一列中会重复使用的内容定义为category,
意味着计算机给每一个内容打上一个标记,比如0,1,2等,
在计算机看来原本的一个个字符串变成了简单的0,1,2等,
但是还是显示各列原本的内容
在实际的操作中是使用对应的标记,然后再显示内容,
并且可以通过标记进行索引
drinks[‘country’] = drinks.country.astype(‘category’)
显示该列的所有category
drinks.country.cat.categories
对列category化,手动设置,
并且可以通过category进行排序,顺序按设置时的顺序从小至大
df[‘quality’] = df.quality.set_categories([
‘good’,
‘very good’,
‘excellent’],
ordered=True)
df[“quality”] = pd.Categorical(
df.quality.set_categories =
[‘good’,
‘very good’,
‘excellent’],
ordered=True)
将该列按category排序
df.sort_values(‘quality’)
筛选该列中>good的行
df.loc[df.quality > ‘good’, :]
part 22 如何使用pandas和scikit-learn创建Kaggle submissions
import pandas as pd
读取训练样本
train = pd.read_csv(‘http://bit.ly/kaggle’)
创建特征列,从训练样本中选取特定两列
feature_cols = [‘Pclass’, ‘Parch’]
需要拟合的数据
X = train.loc[:, feature_cols]
拟合的结果
y = train.Survived
加载sklearn
from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression()
logreg.fit(X, y)
读取测试样本
test = pd.read_csv(‘http://bit.ly/kaggletest’)
设置新的特征列,需要对其进行拟合
X_new = test.loc[:, feature_cols]
对X_new进行逻辑回归,得到预测结果
new_pred_class = logreg.predict(X_new)
创建DataFrame存储结果,同时设置索引
pd.DataFrame({‘PassengerId’:test.PassengerId, ‘Survied’:new_pred_class}).set_index(‘PassengerId’).to_csv(‘sub.csv’)
part 23 随机取样
import pandas as pd
ufo = pd.read_csv(‘文件路径’)
这两种效果一样,均为判断ufo文件中是否由缺失值,
输出为True或者False
ufo.isnull() 与 pd.isnull(ufo))
loc iloc
loc主要用于匹配,iloc侧重偏移量,不包含右边范围
ufo.loc[0:4, :] 与 ufo.iloc[0:4, :]
随机取样
随机取三行,每次运行结果不同
ufo.sample(n=3)
随机取三行,固定结果
ufo.sample(n=3, random_state=42)
随机取75%的行,并固定结果
ufo.sample(frac=0.75, random_state=99)
将随机取的75%样本作为训练样本
train = ufo.sample(frac=0.75, random_state=99)
将剩余的样本作为测试样本
test = ufo.loc[~ufo.index.isin(train.index), :]
part 24 如何创建dummy variables
import pandas as pd
train = pd.read_csv(‘http://bit.ly/kaggletrain’)
创建列Sex_male,当列Sex中为female时,为0,male时,为1
train[‘Sex_male’] = train.Sex.map({‘female’:0, ‘male’:1})
对列中的每一个变量创建单独的列,并以0或1指示
pd.get_dummies(train.Sex)
对于一列中只有两个变量的情况只需保留一列dummy
pd.get_dummies(train.Sex).iloc[:,1:]
创建dummy时列生成带有原列标题内容的标题,以指示数据来源
pd.get_dummies(train.Sex, prefix=‘Sex’).iloc[:, 1:]
将创建的dummy列与原表格合并
Sex_dummies = pd.get_dummies(train.Sex, prefix=‘Sex’).iloc[:, 1:]
train = pd.concat([train, Sex_dummies], axis=1)
同时对表格中多个列创建dummy代替原来的列,
并剪切掉每种dummy的第一列
pd.get_dummies(train, columns=[‘Sex’, ‘Embarked’], drop_first=True)
part 25 日期和时间
import pandas as pd
ufo = pd.read_csv(‘http://bit.ly/uforeports’)
将ufo中的Time列的数据类型转datetime64格式
ufo[‘Time’] = pd.to_datetime(ufo.Time)
只显示ufo表格中Time列的小时数
ufo.Time.dt.hour
星期几
ufo.Time.dt.weekday_name
一周的第几天
ufo.Time.dt.weekday
一年中的第几天
ufo.Time.dt.dayofyear
年份
uof.Time.dt.year
创建一个日期
ts = pd.to_datetime(‘1/1/1999’)
通过创建的日期进行数据筛选,选出在这日期之后的行
ufo.loc[ufo.Time >= ts, :]
查看表格中这一列的最新日期
ufo.Time.max()
查看表格中这一列的最早日期
ufo.Time.min()
最早日期与最新日期间隔天数
(ufo.Time.max() - ufo.Time.min()).days
将year单独作为一列
ufo[‘year’] = ufo.Time.dt.year
year这列中各个年份出现次数,并根据索引排序
ufo.Year.value_counts().sort_index()
根据年份绘制曲线图,注意前面要加载matplotlib
ufo.Year.value_counts.sort_index().plot()
part 26 寻找并删除重复行
import pandas as pd
user_cols = [‘user_id’, ‘age’, ‘gender’, ‘occupation’, ‘zip_code’]
users = pd.read_table(‘http://bit.ly/movieusers’, sep=’|’, header=None, names=user_cols, index_col=‘user_id’)
输出指定列对于行是否重复的布尔值
False – 无重复, True – 与前面某一行重复
user.zip_code.duplicated()
指定列中重复行数量
user.zip_code.duplicated().sum()
整个表格重复行数量
user.duplicated().sum()
显示表格中重复行的首次出现的行
users.loc[users.duplicated(keep=‘first’), :]
显示表格中重复行的最后出现的行
users.loc[users.duplicated(keep=‘last’), :]
显示所有重复行,按表格index顺序显示,被重复与重复行
users.loc[users.duplicated(keep=‘False’), :]
删除表格中重复行的首次出现的行
users.drop_duplicates(keep=‘first’).shape
删除表格中重复行的最后出现的行
users.drop_duplicates(keep=‘last’).shape
删除所有重复行,被重复的行也一同删除
users.drop_duplicates(keep=‘False’).shape
只考虑age,zip_code两列,重复的行数量
users.duplicated(subset=[‘age’, ‘zip_code’]).sum()
删除
users.drop.duplicates(subset=[‘age’, ‘zip_code’]).shape()
part 27 如何避免SettingWithCopyWarning
出现SettingWithCopyWarning
需要查看数据是否变化,有时命令已经起作用了,有时没有
import pandas as pd
movies = pd.read_csv(‘http’)
将表中的NOT RATED 替换为 nan,但是会报错,SettingWithCopyWarning
movies[movies.content_rating==‘NOT RATED’].content_rating = np.nan
正确形式为,替换时需要使用loc
movies.loc[movies.content_rating==‘NOT RATED’, ‘content_rating’] = np.nan
查看列content_rating中缺失数量
movies.content_rating.isnull().sum()
筛选某列中符合条件的行,
加入copy指令防止出错,直接告诉pandas此数据为copy
top_movies = movies.loc[movies.star_rating >=9, :].copy()
part 28 如何改变显示选项
import pandas as pd
drinks = pd.read_csv(‘路径’)
显示默认显示的最大行数 60
pd.get_option(‘display.max_rows’)
显示默认显示的最大列数 20
pd.get_option(‘display.max_columns’)
显示所有行
pd.get_option(‘display.max_rows’, None)
回到默认显示的行数
pd.reset_option(‘display.max_rows’)
train = pd.read_csv(‘http://bit.ly/kaggletrain’)
默认列宽,即显示的最大的字符数 50
pd.get_option(‘display.max_colwidth’)
设置最大列宽为1000字符,以便显示省略的内容
pd.get_option(‘display.max_colwidth’, 1000)
默认显示数字的小数点后6位
pd.get_option(‘display.precision’)
设置为显示小数点后2位
pd.get_option(‘display.precision’, 2)
将表格中的浮点数据类型的数字如12345表示为1,234,5
pd.set_option(‘display.float_format’, ‘{:,}’, format)
显示所有关于显示的选项
pd.describe_option()
可以直接在括号里输入内容搜索相关函数
搜索关于row的函数
pd.describe_option(‘row’)
重置所有关于显示的操作
pd.reset_option(‘all’)
part 29 从另一项目中创建DataFrame
创建一个表格
pd.DataFrame({‘id’:[100, 101, 102], ‘color’:[‘red’, ‘blue’, ‘red’]}, columns=[‘id’, ‘color’], index=[‘a’, ‘b’, ‘c’])
创建表格,指定列
pd.DataFrame([[100, ‘red’], [101, ‘blue’], [102, ‘red’]], columns=[‘id’, ‘color’])
import numpy as np
创建一个numpy数组
arr = np.random.rand(4, 2)
将创建的数组形成表格形式,并定义列标题
pd.DataFrame(arr, columns=[‘one’, ‘two’])
生成表格,其中内容用numpy来设置,将student作为索引
pd.DataFrame({‘student’:np.arange(100, 110, 1), ‘test’:np.random.randint(60, 101, 10)}).set_index(‘student’)
创建一个Series
s = pd.Series([‘red’, ‘square’, index=[‘c’, ‘b’], name=‘shape’)
将创建的Series加入到其他表格中,作为行插入,缺失值为NaN
pd.concat([df, s], axis=1)
part 30 如何使用pandas Series or DataFrame
import pandas as pd
train = pd.read_csv(‘http://bit.ly/kaggletrain’)
train.head()
将Sex这列中的female标记为0,male标记为1,并创建一个新的列存储这些标记
train[‘Sex_male’] = train.Sex.map({‘female’:0, ‘male’:1})
查看Sex和Sex_num这两列
train.loc[0:4, [‘Sex’, ‘Sex_num’]]
新建一列,内容是Name这列的字符长度
train[‘Name_length’] = train.Name.apply(len)
显示Name和Name_length两列
train.loc[0:4, [‘Name’, ‘Name_length’]]
import numpy as np
新建一列,内容是Fare这列数据的取整
train[‘Fare_ceil’] = tain.Fare.apply(np.ceil)
显示这两列
train.loc[0:4, [‘Fare’, ‘Fare_ceil’]]
将字符串用逗号分开
train.Name.str.split(’,’).head
def get_element(my_list, position):
reture my_list[position]
提取出Name这列经过逗号分离后的每一行的第一个元素
train.Name.str.split(’,’).apply(get_element, position=0).head()
或者
train.Name.str.split(’,’).apply(lambda x: x[0]).head
drinks = pd.read_csv(‘http://bit.ly/drinksbycountry’)
显示表中这几列中各自列里面最大的数
drinks.loc[:, ‘beer_servings’:‘wine_servings’].apply(max, axis=0)
显示表中这几列的每一行里面最大的数
drinks.loc[:, ‘beer_servings’:‘wine_servings’].apply(max, axis=1)
显示表中这几列的每一行里面最大的数对应的列标题
drinks.loc[:, ‘beer_servings’:‘wine_servings’].apply(np.argmax, axis=1)
将这几列所有的数值类型都转化为float类型
drinks.loc[:, ‘beer_servings’:‘wine_servings’].applymap(float)
导入对表格部分内容的操作,显示表格
drinks.loc[:, ‘beer_servings’:‘wine_servings’] = drinks.loc[:, ‘beer_servings’:‘wine_servings’].applymap(float)
drinks.head()