数据科学家和软件工程师都在用的Pandas函数有哪些?
本文转载自公众号“读芯术”(ID:AI_Discovery)
软件工程师该像是索引,而不是教科书。你无法记住所有内容,但得知道如何快速查找它们。
能够快速查找和使用函数让我们在编写代码时可以达到一定的流畅程度。因此笔者创建了这份自己每天都在使用的、用于构建网络应用程序和机器学习模型的函数备忘清单。
它不算详尽,但包含了笔者最常使用的函数、示例,以及该何时使用的有效见解。
1.安装
如果想自己运行这些示例,请从Kaggle下载Anime推荐数据集,将其解压缩并放入与jupyter notebook相同的文件夹中。
接下来运行这些指令,应该能重复得出以下任一函数的结果。
import pandas as pd import numpy as npanime =pd.read_csv('anime-recommendations-database/anime.csv') rating = pd.read_csv('anime-recommendations-database/rating.csv')anime_modified= anime.set_index('name')
2.输入
输入CSV(逗号分隔值)
将CSV直接转换为数据框。有时CSV载入数据还需要指定一种编码(即:encoding='ISO-8859–1')。如果数据框包含不可读的字符,应首先尝试上述方法。
对于表格文件,存在一个叫做pd.read_excel的类似函数。
anime =pd.read_csv('anime-recommendations-database/anime.csv')
根据输入数据构建数据框
这在手动示例化简单数据时十分有用,方便查看这些数据运行时如何变化。
df = pd.DataFrame([[1,'Bob','Builder'], [2,'Sally', 'Baker'], [3,'Scott', 'CandleStick Maker']], columns=['id','name', 'occupation'])
df.head()
复制数据框
想保留原始副本同时对数据框进行更改,复制数据框很有用。在输入数据框后立即对其进行复制是很好的做法。
anime_copy =anime.copy(deep=True)
3.查看和检验
获取顶部或底部的n项记录
显示数据框中的前n项记录。笔者通常在notebook中的某个位置打印数据框的顶部记录,以便在忘记其中的内容时可以返回来参考。
anime.head(3) rating.tail(1)
计算行数
这本身不是pandas函数,而是len()函数对行进行计数,并将其保存到变量中,在其他地方使用。
len(df) #=> 3
计算唯一行
计算一列中的唯一值。
len(ratings['user_id'].unique())
获取数据框信息
对于获取一些常规信息(如标题、值的数量和按列的数据类型)很有用。df.dtypes是一个类似但实用性低的函数,仅提供列数据类型。
anime.info()
获取统计数据
如果数据框具有很多数值,获取统计数据非常有用。了解评级列的平均值,最小值和最大值,可以大致了解数据框。
anime.describe()
获取值总和
获取特定列的值总和。
anime.type.value_counts()
4.输出
保存为CSV格式
这将转储到与notebook相同的目录。笔者只保存下面的前10行,但读者不需要这样做。同样,也可使用df.to_excel() 函数,将表格文件保存为CSV格式。
rating[:10].to_csv('saved_ratings.csv',index=False)
5.选取
获取列的值清单或一系列值
需要将列中的值放入X和y变量中以适应机器学习模型时,此方法有效。
anime['genre'].tolist() anime['genre']
anime[‘genre’].tolist()
anime[‘genre’]
获取索引值列表
通过索引创建数值列表。请注意,这里使用了anime_modified数据框,因为索引值更加有趣。
anime_modified.index.tolist()
获取列值列表
anime.columns.tolist()
6.添加/删除
用设置值附加新列
偶尔,当测试集和训练集在两个单独的数据框中,并想在组合它们之前分别标记出行与集的对应关系时,笔者会这样做。
anime['train set'] = True
从一部分列中创建新的数据框
此方法用于只想保留巨型数据框中的几列并且不想指定删除列时。
anime[['name','episodes']]
删除指定列
删除指定列用于仅需删除几列时。否则,写出全部内容可能会很乏味,笔者更喜欢前者,删除指定列。
anime.drop(['anime_id', 'genre','members'], axis=1).head()
添加其他行总和的一行
因其更易于查看,故在此处手动创建一个小型数据框。这里的有趣之处在于,df.sum(axis=0)将值添加到各行或各列中。
计算总和或平均值时,采用同样的逻辑,如:
df.mean(axis=0). f = pd.DataFrame([[1,'Bob',8000], [2,'Sally', 9000], [3,'Scott', 20]],columns=['id','name', 'power level'])df.append(df.sum(axis=0),ignore_index=True)
7.合并
串联两个数据框
用于同行有两个数据框,并想将其组合的情况。这里将数据框分成两部分,然后重新将它们添加在一起。
df1 = anime[0:2]df2 =anime[2:4]pd.concat([df1, df2], ignore_index=True)
合并数据框
想将两个数据框合并在一列时,合并数据框就如同SQL(结构化查询语言)的左联接用法。
rating.merge(anime,left_on=’anime_id’, right_on=’anime_id’, suffixes=(‘_left’, ‘_right’))
8.筛选
检索匹配索引值的行
anime_modified中的索引值是动漫的名称。请注意,如何使用这些名称来获取特定列。
anime_modified.loc[['Haikyuu!!Second Season','Gintama']]
通过编号索引值来检索行
与上面的函数不同,使用 iloc,第一行的索引值为0,第二行的索引值为1,以此类推……即便在修改数据框后,在索引列中使用字符串值。
使用此函数,当你想获得数据框中的前3行。
anime_modified.iloc[0:3]
获取行
在给定列表的列值中检索行。匹配单个值时,anime[anime[‘type’] == 'TV']也适用。
anime[anime['type'].isin(['TV','Movie'])]
拆分数据框
这就像拆分表格一样。拆分数据框,来获取在特定索引前/中/后的所有行。
anime[1:3]
通过值筛选
筛选符合条件的行的数据框。但注意,这将维持现有的索引值。
anime[anime['rating'] > 8]
9.排序
排序函数sort_values
按列中的值对数据框进行排序。
anime.sort_values('rating',ascending=False)
10.汇总
分组和计数
计算列中每个不同值的记录数。
anime.groupby('type').count()
以不同方式对列进行分组和汇总
注意,笔者添加了 reset_index() 函数,否则,下文的“type”列将成为索引列——笔者建议在多数情况下这样做。
anime.groupby(["type"]).agg({ "rating": "sum", "episodes":"count", "name": "last" }).reset_index()
创建数据透视表
数据透视表是比较适合从数据框中提取数据子集的工具。
需注意,笔者已对数据框进行了大量筛选,因此可以更快地构建数据透视表。
tmp_df = rating.copy() tmp_df.sort_values('user_id', ascending=True, inplace=True) tmp_df = tmp_df[tmp_df.user_id < 10] tmp_df = tmp_df[tmp_df.anime_id < 30] tmp_df = tmp_df[tmp_df.rating != -1]pd.pivot_table(tmp_df, values='rating',index=['user_id'], columns=['anime_id'], aggfunc=np.sum, fill_value=0)
11.整理
设置非数(NaN)单元格为某个值
设置非数值单元格为0。示例中,笔者像之前一样创建了相同的数据透视表,但不使用fill_value=0,而是使用 fillna(0)进行填充。
pivot = pd.pivot_table(tmp_df, values='rating',index=['user_id'], columns=['anime_id'], aggfunc=np.sum)pivot.fillna(0)
12.其他
采样数据框
笔者一直从较大的数据框中提取少量样本。如果frac = 1,则可以在保留索引的情况下随机重新排行。
anime.sample(frac=0.25)
迭代行索引
在数据框中迭代索引和行。
for idx,row inanime[:2].iterrows(): print(idx, row)
启动jupyter notebook
以高数据速率限制启动jupyter notebook程序。
jupyter notebook —NotebookApp.iopub_data_rate_limit=1.0e10