首先我们需要提前下载示例数据集:drinksbycountry.csv:http://bit.ly/drinksbycountryimdbratings.csv:http://bit.ly/imdbratingschiporders.csv:http://bit.ly/chiporderssmallstockers.csv:http://bit.ly/smallstockskaggletrain.csv:http://bit.ly/kaggletrainuforeports.csv:http://bit.ly/uforeports使用以下代码导入上述数据集:1.显示安装的版本input以下命令查询pandas版本:如果还想知道pandas依赖的模块版本,可以使用show_versions()函数:可以查看Python、pandas、Numpy、matplotlib等版本信息。2.创建示例DataFrame假设您需要创建一个示例DataFrame。有很多方法可以实现它。我最喜欢的方式是给DataFrame构造函数传递一个字典,其中字典中的键是列名,值是列的值。现在如果你需要创建一个更大的DataFrame,上面的方法需要太多的输入。在这种情况下,你可以使用Numpy的random.rand()函数,告诉它行数和列数,并将它传递给DataFrame构造函数:这样可以,但是如果你还想将列名更改为非数字类型,您可以强制将一串字符分配给columns参数:您可以想象,您传递的字符串的长度必须与列数相同。3.更改列名让我们看一下我们刚刚创建的示例DataFrame:我更喜欢在选择pandas列时使用点(.),但这不适用于列名中带有空格的列。让我们解决这个问题。更改列名最灵活的方法是使用rename()函数。可以传一个字典,其中键是原来的列名,值是新的列名,还可以指定轴:如果需要改变任意数量的列,最好使用这个函数名称,无论是一列还是所有列。如果需要一次重新排序所有的列名,更简单的方法是重写DataFrame的columns属性:,这是因为不需要输入所有的列名:上述三个函数的结果是同样,你可以改变列名,让列名不包含空格:function:4.行序反转让我们看看饮料DataFame:这个数据集描述了每个国家的平均酒精消费量。如果你想颠倒行序怎么办?最直接的方法是使用loc函数,并传入::-1,这与Python中反转列表时使用的切片表示法一致:如果你也想重新设置索引,使其从0开始怎么办?您可以使用reset_index()函数告诉它删除之前的索引并将其完全丢弃:如您所见,行顺序已颠倒,索引已重置为默认整数序号。5.列顺序反转和前面的技巧一样,也可以使用loc函数将列从左到右反转:逗号前的冒号表示全选,逗号后的::-1表示反转所有列。这就是国家/地区栏现在位于最右侧的原因。6.按数据类型选择列这里是drinksDataFrame的数据类型:也可以使用这个函数来选择数据类型为object的列:也可以选择多个数据类型,只需要传一个list即可:也可以用它来排除特定的数据类型:7.将字符类型转换为Numeric我们再创建一个exampleDataFrame:这些数字实际上是以chars的形式存储的,导致object的数据类型:为了对这些列进行数学运算,我们需要将数据类型转换为numeric。可以在前两列使用astype()函数:但是,如果在第三列也使用该函数,则会导致错误,因为该列包含破折号(用于表示0),而pandas不知道如何去处理它。你可以在第三列使用to_numeric()函数,告诉它把任何无效数据转换成NaN:如果你知道NaN值代表0,那么你可以用fillna()函数将它们替换成0:最后,你可以一次在整个DataFrame上传递apply()函数:我们的目标只用一行代码就完成了,因为现在所有数据类型都转换为float:8.减少DataFrame空间大小pandasDataFrames被设计为适合内存,所以有时您可以减小DataFrame的大小以使其在您的系统上表现更好。这是drinksDataFrame占用的空间大小:可以看到它使用了304.KB。如果您的DataFrame有操作问题,或者您无法将其读入内存,您可以在文件读取期间使用两个步骤来减小DataFrame的大小。第一步是通过调用usecols参数只读取您实际需要的那些列:通过只读取使用的两列,我们将DataFrame的大小减少到13.6KB。第二步,将所有实际上是分类变量的object列都转换为分类变量,可以调用dtypes参数:通过读取continent列作为类别数据类型,我们进一步减少了DataFrame的空间大小到2.3KB。值得注意的是,如果类别数据类型的列数与行数相比相对较少,那么类别数据类型可以减少内存占用。9.按行从多个文件构建一个DataFrame假设你的数据集被分成多个文件,但你需要将这些数据集读入一个DataFrame。例如,我有一些关于股票的分数聚合,每个数据集都是一天的CSV文件。这是第1天:这是第2天:这是第3天:您可以将每个CSV文件读入一个DataFrame,加入它们,然后删除原始DataFrame,但这会占用更多时间内存并需要大量代码。更好的方法是使用内置的glob模块。您可以将一些模式传递给glob()函数,包括未知字符,它会返回与特定内容匹配的文件列表。这样,glob将找到所有以stocks开头的CSV文件:glob将以任意顺序返回文件名,这就是我们使用Python内置的sorted()函数对列表进行排序的原因。我们使用read_csv()函数作为生成器表达式读取每个文件,并将结果传递给concat()函数,该函数按行组合各个DataFrame:不幸的是,索引值中存在重复项。为了避免这种情况,我们需要告诉concat()函数忽略索引,并使用默认的整数索引:10.按列从多个文件构建DataFrame前面的技巧对于每个文件包含行的数据集很有用。但是如果数据集中的每个文件都包含列信息呢?下面是一个示例,其中dinks数据集被分成两个CSV文件,每个文件包含三列:这一次,我们需要告诉concat()函数按列组合:我们的DataFrame现在有六列。11.从剪贴板创建DataFrame假设您将一些数据存储在Excel或GoogleSheet中,并且您想尽快将它们读入DataFrame。您需要选择数据并将其复制到剪贴板。然后,您可以使用read_clipboard()函数将它们读入DataFrame:类似于read_csv(),read_clipboard()会自动检测每一列的正确数据类型:让我们复制另一个数据到剪贴板:magic是的,pandas已经索引第一列:请注意,如果您希望您的工作在将来可以重现,则不建议使用read_clipboard()。12.将一个DataFrame分成两个随机子集假设你想将一个DataFrame分成两部分,随机将75%的行给一个DataFrame,剩下的25%给另一个DataFrame。例如,我们的电影评分DataFrame有979行:我们可以使用sample()函数随机选择75%的行并将它们分配给“movies_1”DataFrame:然后我们使用drop()函数删除“moive_1”",将剩余的行分配给“movies_2”DataFrame:可以看到总行数是正确的:还可以查看每部电影的索引,或者“moives_1”:或者“moives_2”:需要注意的是如果索引值不唯一,则此方法不起作用。读者注:这种方法在机器学习或者深度学习中非常有用,因为在模型训练之前,我们往往需要将整个数据集按照一定的比例划分为训练集和测试集。这种方法简单高效,值得学习和尝试。13.多种类型过滤DataFrame我们先来看电影的DataFrame:其中一列是genre(类型):比如我们要过滤DataFrame,我们只想显示流派为Action或Drama或WesternMovies,我们可以使用多个条件,用“或”符号分隔:不过,实际上您可以使用isin()函数来更清楚地编写代码,将流派列表传递给该函数:如果您想做相反的过滤,即如果你排除了刚才的三种类型的电影,那么你可以在过滤条件前加一个破折号:这个方法有效,因为在Python中,波浪号代表“不”操作。14.从DataFrame中过滤出类别最多的类别假设要按流派过滤MoviesDataFrame,但只需要数量最多的前3个流派。我们对流派使用value_counts()函数并将其保存为计数(类型为系列):&emp;这个Series的nlargest()函数可以轻松计算出Series中前3个最大值:需要的是索引:最后,我们将这个索引传递给isin()函数,它把它当作流派列表:因此,DataFrame中只剩下Drame、Comdey和Action三种类型的电影。15.处理缺失值让我们看一下UFOsightingsDataFrame:你会注意到一些值缺失了。要找出每列中缺少多少个值,可以使用isna()函数后接sum():isna()会产生一个True和False的DataFrame,sum()会将所有True和ConvertValue相加1、False为0并将它们相加。同样,您可以使用mean()和isna()函数找到每列中缺失值的百分比。如果要删除包含缺失值的列,可以使用dropna()函数:或者如果要删除包含超过10%缺失值的列,可以为dropna()设置一个阈值:len(ufo)返回总行数,我们将其乘以0.9以告诉pandas保留那些至少90%的值不丢失的列。16.将一个字符串分成多个列让我们创建另一个新的示例DataFrame:如果我们需要将列“name”分成三个单独的列来分别表示名字、中间名和姓氏怎么办?我们将使用str.split()函数,告诉它按空格拆分,并将结果扩展到DataFrame中:这三列实际上可以用一行代码保存到原始DataFrame中:一个字符串,但是只保留一个结果列呢?例如,让我们将位置列除以“,”:如果我们只想保留第0列作为城市名称,我们只需要选择该列并将其保存到DataFrame:17。将一系列列表扩展为DataFrame让我们创建一个新的示例DataFrame:这里有两列,第二列包含Python中的整数元素列表。如果我们想将第二列扩展成一个DataFrame,我们可以在该列上使用apply()函数并将其传递给Series构造函数:18.聚合多个函数让我们看一下从Chipotle连锁餐厅获得的订单DataFrame:每个订单(order)都有一个订单号(order_id),包含一行或多行。要找出每个订单的总价,您可以将该订单号的价格(item_price)相加。例如1号订单的总价:如果要计算每笔订单的总价,可以对order_id使用groupby(),然后对每组的item_price进行求和。但是,实际上不可能只使用一个函数,比如sum(),来进行聚合。为了聚合多个函数,您可以使用agg()函数,将函数列表传递给它,例如sum()和count():这将告诉我们未平仓订单的总价格和数量。19.将聚合结果与DataFrame结合起来让我们再看一下订单DataFrame:如果我们想添加一个新列来显示每个订单的总价怎么办?回想一下,我们通过使用sum()函数获得总价:sum()是一个聚合函数,这意味着它返回输入数据的简化版本。换句话说,sum()函数的输出:小于该函数的输入:解决方案是使用transform()函数,它将执行相同的操作但返回与输入数据相同的形状:我们将此结果存储在DataFrame的新列中:如您所见,每行显示每个订单的总价。这样我们就可以很容易地伪造出每个订单的价格占订单总价格的百分比:20.选取一个行和列的切片我们再来看一个数据集:这是著名的泰坦尼克号数据集,保存泰坦尼克号上乘客的信息以及他们是否生还。如果你想对这个数据集做一个数值总结,你可以使用describe()函数:然而,DataFrame结果显示的信息可能比你想要的要多。如果想对结果进行过滤,只显示“五数汇总”信息,可以使用loc函数,把从“min”到“max”的slice传过去:如果你不是对所有列感兴趣的话,也可以传递列名的切片:21.ReshapetheMultiIndexedSeriesTitanic数据集的Survived列由1和0组成,因此可以计算该列的整体生存率:如果要计算生存对于一个类别的生存率,例如“性别”,可以使用groupby():如果要同时计算两个类别变量的生存率,可以使用groupby()生存率结合乘客等级。它存储为MultiIndexedSeries,这意味着它对实际数据具有多个索引级别。这使得数据难以读取和交互,因此通过unstack()函数将MultiIndexedSeries重塑为DataFrame更方便:此DataFrame包含与MultiIndexedSeries相同的数据,不同的是现在您可以使用熟悉的DataFrame函数对其进行操作。22.创建数据透视表(pivottable)如果您经常使用上述方法创建DataFrames,您可能会发现使用pivot_table()函数更方便:要使用数据透视表,需要指定索引(index)、列名(columns)、值(values)和聚合函数(aggregationfunction)。数据透视表的另一个好处是,您可以通过设置margins=True轻松地将行和列相加:此结果显示总体存活率以及Sex和PassengerClass的存活率。最后,您可以通过将聚合函数从“均值”更改为“计数”来创建交叉表:结果显示每对分类变量组合的记录总数。23.将连续数据转化为分类数据我们来看Titanic数据集中的Age列:现在是连续数据,但是如果我们想将它转化为分类数据呢?一种解决方案是标记年龄范围,例如“成人”、“年轻成人”、“儿童”。执行此操作的最佳方法是使用cut()函数:这将标记每个值。0-18岁为“儿童”,18-25岁为“青壮年”,25-99岁为“成人”。注意数据类型是分类变量,分类变量是自动排序的(有序分类变量)。24.更改显示选项让我们再看一下泰坦尼克号数据集:注意年龄列保持小数点后一位,票价列保持小数点后四位。如果要将结果标准化并显示为小数点后两位怎么办?可以使用set_option()函数:set_option()函数中的第一个参数是选项的名称,第二个参数是Python格式化字符。可以看到Age栏和Fare栏现在都保留了两位小数。请注意,这不会修改基础数据类型,只会修改数据的显示。您还可以将任何选项重置为其默认值:其他选项也是如此。25.设置DataFrame如果您想修改整个jupyternotebook中的显示,前面的技术会很有用。然而,一种更灵活和有用的方法是在特定的DataFrame中定义格式(样式)。让我们回到股票DataFrame:我们可以创建一个格式字符串字典来格式化每一列。然后将其传递给DataFrame的style.format()函数:注意Date列采用月-日-年格式,Close列包含一个$符号,而Volume列包含逗号。我们可以通过链接函数应用更多格式:我们现在隐藏索引,以红色突出显示Close列中的最小值,并以浅绿色突出显示Close列中的最大值。这是DataFrame格式化的另一个示例:Volume列现在具有渐变背景色,因此您可以轻松识别大值和小值。最后一个示例:现在,Volumn列上有一个条形图,DataFrame上有一个标题。请注意,还有许多其他选项可用于格式化DataFrame。额外提示:剖析DataFrame假设您获得了一个新数据集,并且不想花费太多精力,只想快速探索它。然后你可以使用pandas-profiling模块。在您的系统上安装该模块,然后使用ProfileReport()函数,将任何DataFrame作为参数传递。它将返回一个交互式HTML报告:第一部分是数据集的概述,以及数据集可能存在的问题列表;第二部分是每一栏的总结。您可以点击“切换详情”获取更多信息;第三部分显示列之间的相关热图;第四部分是缺失值报告;第五部分显示数据和前几行。使用示例如下(仅展示报告的第一部分):这部分代码已经放在Github上https://github.com/percent4/panas_usage_25_tricks。谢谢阅读~
