深入浅出Pandas:利用Python进行数据处理与分析,python数据分析 活用pandas
本文主要分享熊猫的一些实用技能,共26条。这些技能对你的数据处理是必不可少的。感兴趣的朋友可以跟着边肖学习。
00-1010从剪贴板创建数据帧,将数据帧划分为两个随机子集,按多种类型筛选数据帧,筛选最大数量的类别,处理缺失值,将一个字符串划分为多个列,将系列扩展为数据帧,聚合多个函数,聚合结果并将其与数据帧组合,选择行和列的切片,多索引系列重塑创建数据透视表连续数据以分类数据样式a数据帧附加技能简介a数据帧您好,今天我想与您分享一个熊猫实用技能,这是26这些技能对你的数据处理是必不可少的。欢迎收藏他们,喜欢记得喜欢关注他们。
目录
假设你在Excel或者Google Sheet中存储了一些数据,你想尽快把它们读入DataFrame。
您需要选择这些数据并将其复制到剪贴板。然后,您可以使用read_clipboard()函数将它们读入数据帧:
与read_csv()类似,read_clipboard()会自动检测每列的正确数据类型:
让我们将另一个数据复制到剪贴板:
神奇的是,熊猫使用了第一列作为索引:
需要注意的是,如果你希望自己的作品在未来具有可复制性,那么read_clipboard()就不值得推荐。
从剪贴板中创建DataFram
假设您想将一个数据帧分成两部分,随机将75%的行分配给一个数据帧,将剩余的25%分配给另一个数据帧。
例如,我们的电影分级数据帧有979行:
我们可以使用sample()函数随机选择75%的行,并将它们分配给“movies_1”数据帧:
然后,我们使用drop()函数丢弃出现在“电影_1”中的行,并将剩余的行分配给“电影_2”数据帧:
您可以看到总行数是正确的:
你也可以查看每部电影的索引,或者 moives_1:
或“moives _ 2”3360
应该指出,这个方法在索引值不唯一的情况下不起作用。
注:方法在机器学习或者深度学习中非常有用,因为在模型训练之前,我们往往需要将所有数据集按照一定的比例划分为训练集和测试集。这种方法简单高效,值得学习和尝试。
将DataFrame划分为两个随机的子集
让我们先来看看电影这个数据框架:
[60]:中
movies.head()
【60】:
一列是流派(类型)3360。
例如,如果我们想过滤数据帧,我们只想显示动作或d类型。
rama或者Western的电影,我们可以使用多个条件,以"or"符号分隔:
In [62]:movies[(movies.genre == Action)
(movies.genre == Drama)
(movies.genre == Western)].head()
Out[62]:
但是,你实际上可以使用isin()函数将代码写得更加清晰,将genres列表传递给该函数:
In [64]:movies[~movies.genre.isin([Action, Drama, Western])].head()
Out[64]:
如果你想要进行相反的过滤,也就是你将吧刚才的三种类型的电影排除掉,那么你可以在过滤条件前加上破浪号:
In [64]:movies[~movies.genre.isin([Action, Drama, Western])].head()
Out[64]:
这种方法能够起作用是因为在Python中,波浪号表示not操作。
DataFrame筛选数量最多类别
假设你想要对movies这个DataFrame通过genre进行过滤,但是只需要前3个数量最多的genre。
我们对genre使用value_counts()函数,并将它保存成counts(type为Series):
该Series的nlargest()函数能够轻松地计算出Series中前3个最大值:
事实上我们在该Series中需要的是索引:
最后,我们将该索引传递给isin()函数,该函数会把它当成genre列表:
In [68]:movies[movies.genre.isin(counts.nlargest(3).index)].head()
Out[68]:
这样,在DataFrame中只剩下Drame, Comdey, Action这三种类型的电影了。
处理缺失值
让我们来看一看UFO sightings这个DataFrame:
你将会注意到有些值是缺失的。
为了找出每一列中有多少值是缺失的,你可以使用isna()函数,然后再使用sum():
isna()会产生一个由True和False组成的DataFrame,sum()会将所有的True值转换为1,False转换为0并把它们加起来。
类似地,你可以通过mean()和isna()函数找出每一列中缺失值的百分比。
如果你想要舍弃那些包含了缺失值的列,你可以使用dropna()函数:
或者你想要舍弃那么缺失值占比超过10%的列,你可以给dropna()设置一个阈值:
len(ufo)返回总行数,我们将它乘以0.9,以告诉pandas保留那些至少90%的值不是缺失值的列。
一个字符串划分成多列
我们先创建另一个新的示例DataFrame:
如果我们需要将name这一列划分为三个独立的列,用来表示first, middle, last name呢?我们将会使用str.split()函数,告诉它以空格进行分隔,并将结果扩展成一个DataFrame:
这三列实际上可以通过一行代码保存至原来的DataFrame:
如果我们想要划分一个字符串,但是仅保留其中一个结果列呢?比如说,让我们以", "来划分location这一列:
如果我们只想保留第0列作为city name,我们仅需要选择那一列并保存至DataFrame:
Series扩展成DataFrame
让我们创建一个新的示例DataFrame:
这里有两列,第二列包含了Python中的由整数元素组成的列表。
如果我们想要将第二列扩展成DataFrame,我们可以对那一列使用apply()函数并传递给Series constructor:
通过使用concat()函数,我们可以将原来的DataFrame和新的DataFrame组合起来:
对多个函数进行聚合
让我们来看一眼从Chipotle restaurant chain得到的orders这个DataFrame:
In [82]:orders.head(10)
Out[82]:
每个订单(order)都有订单号(order_id),包含一行或者多行。为了找出每个订单的总价格,你可以将那个订单号的价格(item_price)加起来。比如,这里是订单号为1的总价格:
如果你想要计算每个订单的总价格,你可以对order_id使用groupby(),再对每个group的item_price进行求和。
但是,事实上你不可能在聚合时仅使用一个函数,比如sum()。**为了对多个函数进行聚合,你可以使用agg()函数,**传给它一个函数列表,比如sum()和count():
这将告诉我们没定订单的总价格和数量。
聚合结果与DataFrame组合
让我们再看一眼orders这个DataFrame:
In [86]:orders.head(10)
Out[86]:
如果我们想要增加新的一列,用于展示每个订单的总价格呢?回忆一下,我们通过使用sum()函数得到了总价格:
sum()是一个聚合函数,这表明它返回输入数据的精简版本(reduced version )。
换句话说,sum()函数的输出:
比这个函数的输入要小:
解决的办法是使用transform()函数****,它会执行相同的操作但是返回与输入数据相同的形状:
我们将这个结果存储至DataFrame中新的一列:
In [91]:orders[total_price] = total_price
orders.head(10)
Out[91]:
你可以看到,每个订单的总价格在每一行中显示出来了。
这样我们就能方便地甲酸每个订单的价格占该订单的总价格的百分比:
In [92]:orders[percent_of_total] = orders.item_price / orders.total_price
orders.head(10)
In [92]:
选取行和列的切片
让我们看一眼另一个数据集:
In [93]:titanic.head()
Out[93]:
这就是著名的Titanic数据集,它保存了Titanic上乘客的信息以及他们是否存活。
如果你想要对这个数据集做一个数值方面的总结,你可以使用describe()函数:
但是,这个DataFrame结果可能比你想要的信息显示得更多。
如果你想对这个结果进行过滤,只想显示五数概括法(five-number summary)的信息,你可以使用loc函数并传递"min"到"max"的切片:
如果你不是对所有列都感兴趣,你也可以传递列名的切片:
MultiIndexed Series重塑
Titanic数据集的Survived列由1和0组成,因此你可以对这一列计算总的存活率:
如果你想对某个类别,比如Sex,计算存活率,你可以使用groupby():
如果你想一次性对两个类别变量计算存活率,你可以对这些类别变量使用groupby():
该结果展示了由Sex和Passenger Class联合起来的存活率。它存储为一个MultiIndexed Series,也就是说它对实际数据有多个索引层级。
这使得该数据难以读取和交互,因此更为方便的是通过unstack()函数将MultiIndexed Series重塑成一个DataFrame:
该DataFrame包含了与MultiIndexed Series一样的数据,不同的是,现在你可以用熟悉的DataFrame的函数对它进行操作。
创建数据透视表
如果你经常使用上述的方法创建DataFrames,你也许会发现用pivot_table()函数更为便捷:
想要使用数据透视表,你需要指定索引(index), 列名(columns), 值(values)和聚合函数(aggregation function)。
数据透视表的另一个好处是,你可以通过****设置margins=True轻松地将行和列都加起来:
这个结果既显示了总的存活率,也显示了Sex和Passenger Class的存活率。
最后,你可以创建交叉表(cross-tabulation),只需要将聚合函数由"mean"改为"count":
这个结果展示了每一对类别变量组合后的记录总数。
连续数据转类别数据
让我们来看一下Titanic数据集中的Age那一列:
它现在是连续性数据,但是如果我们想要将它转变成类别数据呢?
一个解决办法是对年龄范围打标签,比如"adult", young adult, child。实现该功能的最好方式是使用cut()函数:
这会对每个值打上标签。0到18岁的打上标签"child",18-25岁的打上标签"young adult",25到99岁的打上标签adult。
注意到,该数据类型为类别变量,该类别变量自动排好序了(有序的类别变量)。
Style a DataFrame
上一个技巧在你想要修改整个jupyter notebook中的显示会很有用。但是,一个更灵活和有用的方法是定义特定DataFrame中的格式化(style)。
让我们回到stocks这个DataFrame:
我们可以创建一个格式化字符串的字典,用于对每一列进行格式化。然后将其传递给DataFrame的style.format()函数:
注意到,Date列是month-day-year的格式,Close列包含一个$符号,Volume列包含逗号。
我们可以通过链式调用函数来应用更多的格式化:
我们现在隐藏了索引,将Close列中的最小值高亮成红色,将Close列中的最大值高亮成浅绿色。
这里有另一个DataFrame格式化的例子:
Volume列现在有一个渐变的背景色,你可以轻松地识别出大的和小的数值。
最后一个例子:
现在,Volumn列上有一个条形图,DataFrame上有一个标题。
请注意,还有许多其他的选项你可以用来格式化DataFrame。
额外技巧
Profile a DataFrame
假设你拿到一个新的数据集,你不想要花费太多力气,只是想快速地探索下。那么你可以使用****pandas-profiling这个模块。
在你的系统上安装好该模块,然后使用ProfileReport()函数,传递的参数为任何一个DataFrame。它会返回一个互动的HTML报告:
- 第一部分为该数据集的总览,以及该数据集可能出现的问题列表
- 第二部分为每一列的总结。你可以点击"toggle details"获取更多信息
- 第三部分显示列之间的关联热力图
- 第四部分为缺失值情况报告
- 第五部分显示该数据及的前几行
使用示例如下(只显示第一部分的报告):
以上就是Python数据处理的26个Pandas实用技巧总结的详细内容,更多关于Python Pandas技巧的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。