30 个小例子帮你快速掌握Pandas
↑↑↑点击上方蓝字,回复资料,10个G的惊喜
作者:Soner Yıldırım
链接:https://towardsdatascience.com/30-examples-to-master-pandas-f8a2da751fa4
Pandas是Python最知名的数据分析和处理库。它提供了许多的函数和方法,可加快数据分析和预处理步骤。今天介绍的这些示例将涵盖您可能在典型的数据分析过程中使用的几乎所有函数和方法。
读取数据集
本次演示使用Kaggle上提供的客户流失数据集[1]。
让我们从将csv文件读取到pandas DataFrame开始。
import numpy as np
import pandas as pd
df = pd.read_csv("/data/churn.csv")
df.shape
---
(10000,14)
df.columns
---
Index(['RowNumber', 'CustomerId', 'Surname',
'CreditScore', 'Geography', 'Gender', 'Age',
'Tenure', 'Balance', 'NumOfProducts',
'HasCrCard','IsActiveMember','EstimatedSalary',
'Exited'], dtype='object')
1.删除列
df.drop(['RowNumber', 'CustomerId',
'Surname', 'CreditScore'], axis=1,
inplace=True)
df.shape
---
(10000,10)
axis参数设置为1表示删除列,0表示行。inplace参数设置为True以保存更改。我们删除了4列,因此列数从14减少到10。
2.读取时选择特定的列
我们只打算读取csv文件中的某些列。读取时,列列表将传递给usecols参数。如果您事先知道列名,则比以后删除更好。
df_spec = pd.read_csv("/data/churn.csv",
usecols=['Gender', 'Age', 'Tenure', 'Balance'])
df_spec.head()
3.读取DataFrame的一部分行
read_csv
函数允许按行读取DataFrame的一部分。有两种选择。第一个是读取前n行。
df_partial = pd.read_csv("/data/churn.csv",
nrows=500)
df_partial.shape
---
(500,14)
使用nrows
参数,我们创建了一个包含csv文件的前500行的DataFrame。
我们还可以使用skiprows
参数从文件末尾选择行。Skiprows = 5000表示在读取csv文件时我们将跳过前5000行。
也可以把nrows
和skiprows
结合使用,就相当于MySQL里的limit 500 offset 5000
4.抽样
创建DataFrame后,我们可能希望抽取一个小样本以便于进行工作。我们可以使用n参数或frac参数来确定样本大小。
n:样本中的行数 frac:样本大小与整个DataFrame大小的比率
df_sample = df.sample(n=1000)
df_sample.shape
(1000,10)df_sample2 = df.sample(frac=0.1)
df_sample2.shape
---
(1000,10)
5.缺失值检查
isna函数用于确定DataFrame中的缺失值。通过将isna与sum函数一起使用,我们可以看到每列中缺失值的数量。
df.isna().sum()
6.使用loc和iloc添加缺失值
我正在做这个例子来练习loc
和iloc
。这些方法根据索引或标签选择行和列。
loc:带标签选择 iloc:用索引选择
先创建20个随机indices。
missing_index = np.random.randint(10000,size = 20)
接下来将某些值更改为np.nan(缺失值)。
df.loc [missing_index,['Balance','Geography']] = np.nan
Balance
和Geography
列中缺少20个值。让我们做另一个使用索引而不是标签的示例。
df.iloc [missing_index,-1] = np.nan
"-1"是最后一列Exit
的索引。
尽管我们对loc
和iloc
使用了不同的列表示形式,但行值没有改变。原因是我们使用数字索引标签。因此,行的标签和索引都相同。
缺失值的数量已更改:
7.填充缺失值
fillna
函数用于填充缺失值。它提供了许多选项。我们可以使用特定值,聚合函数(例如均值)或上一个或下一个值。
对于Geography
列,我将使用最常见的值。
mode = df['Geography'].value_counts().index[0]
df['Geography'].fillna(value=mode, inplace=True)
同样,对于Balance
列,我将使用列的均值替换缺失值。
avg = df['Balance'].mean()
df['Balance'].fillna(value=avg, inplace=True)
fillna
函数的method参数可用于根据列中的上一个或下一个值填充缺失值(例如method ='ffill'
)。这对于顺序数据(例如时间序列)非常有用。
8.删除缺失值
处理缺失值的另一种方法是删除它们。“已退出”列中仍缺少值。以下代码将删除缺少任何值的行。
df.dropna(axis=0, how='any', inplace=True)
axis = 1
用于删除缺少值的列。我们还可以为列或行具有的非缺失值的数量设置阈值。例如,thresh = 5
表示一行必须具有至少5个不可丢失的非丢失值。缺失值小于或等于4的行将被删除。
DataFrame现在没有任何缺失值。
df.isna().sum().sum()
---
0
9.根据条件选择行
在某些情况下,我们需要适合某些条件的观察值(即行)。例如,下面的代码将选择居住在法国并且已经流失的客户。
france_churn = df[(df.Geography == 'France') \
& (df.Exited == 1)]
france_churn.Geography.value_counts()
---
France 808
10.用查询描述条件
查询函数提供了一种更灵活的条件传递方式。我们可以用字符串描述它们。
df2 = df.query('80000 < Balance < 100000')
让我们通过绘制Balance
列的直方图来确认结果。
df2['Balance'].plot(kind='hist', figsize=(8,5))
11.用isin描述条件
条件可能有几个值。在这种情况下,最好使用isin方法,而不是单独写入值。
我们只传递期望值的列表。
df[df['Tenure'].isin([4,6,9,10])][:3]
12.groupby函数
Pandas Groupby
函数是一种通用且易于使用的函数,有助于获得数据概览。它使探索数据集和揭示变量之间的潜在关系变得更加容易。
我们将为groupby函数写几个例子。让我们从一个简单的开始。下面的代码将根据地理位置和性别的组合对行进行分组,然后为我们提供每组的平均流失率。
df[['Geography','Gender','Exited']]\
.groupby(['Geography','Gender']).mean()
13.通过groupby应用多个聚合函数
agg函数允许在组上应用多个聚合函数。函数列表作为参数传递。
df[['Geography','Gender','Exited']].\groupby(['Geography','Gender']).agg(['mean','count'])
我们可以看到每组中观察值(行)的数量和平均流失率。
14.将不同的汇总函数应用于不同的组
我们不必对所有列都应用相同的函数。例如,我们可能希望查看每个国家/地区的平均余额和流失的客户总数。
我们将传递一个字典,该字典指示哪些函数将应用于哪些列。
df_summary = df[['Geography','Exited','Balance']]\
.groupby('Geography')\
.agg({'Exited':'sum', 'Balance':'mean'})
df_summary.rename(columns={'Exited':'# of churned customers',
'Balance':'Average Balance of Customers'},inplace=True)
df_summary
我还重命名了这些列。
NamedAgg函数允许重命名聚合中的列。语法如下:
df_summary = df[['Geography','Exited','Balance']].groupby('Geography')\
.agg(
Number_of_churned_customers = pd.NamedAgg('Exited', 'Sum'),
Average_balance_of_customers = pd.NamedAgg('Balance', 'Mean')
)
15.重置索引
您可能已经注意到,groupby
返回的DataFrame的索引由组名组成。我们可以通过重置索引来更改它。
df_new = df[['Geography','Exited','Balance']]\
.groupby(['Geography','Exited']).mean().reset_index()
df_new
如果我们将groupby
函数的as_index
参数设置为False
,则组名将不会用作索引。
16.带删除的重置索引
在某些情况下,我们需要重置索引并同时删除原始索引。考虑从DataFrame中抽取样本的情况。该示例将保留原始DataFrame的索引,因此我们要重置它。
df[['Geography','Exited','Balance']]\
.sample(n=6).reset_index()
重设索引,但原始索引保留为新列。我们可以在重置索引时将其删除。
df[['Geography','Exited','Balance']]\
.sample(n=6).reset_index(drop=True)
17.设置特定的列作为索引
我们可以将DataFrame中的任何列设置为索引。
df_new.set_index('Geography')
18.插入新列
我们可以向DataFrame添加新列,如下所示:
group = np.random.randint(10, size=6)
df_new['Group'] = group
df_new
但新列将添加在末尾。如果要将新列放在特定位置,则可以使用插入函数。
df_new.insert(0, 'Group', group)
df_new
第一个参数是位置的索引,第二个参数是列的名称,第三个参数是值。
19.where函数
它用于根据条件替换行或列中的值。默认替换值是NaN,但我们也可以指定要替换的值。
考虑上一步(df_new)中的DataFrame。我们希望将小于6的客户的Balance
设置为0。
df_new['Balance'] = df_new['Balance']\
.where(df_new['Group'] >= 6, 0)
df_new
符合指定条件的值将保持不变,而其他值将替换为指定值。
20.排名函数
它为这些值分配一个等级。让我们创建一个根据客户余额对客户进行排名的列。
df_new['rank'] = df_new['Balance']\
.rank(method='first', ascending=False).astype('int')
df_new
method参数指定如何处理具有相同值的行。first
表示根据它们在数组(即列)中的顺序对其进行排名。
21.列中唯一值的数量
使用分类变量时,它很方便。我们可能需要检查唯一类别的数量。
我们可以检查由value counts函数返回的序列的大小,也可以使用nunique
函数。
22.内存使用
只需通过memory_usage
函数即可完成。
这些值显示以字节为单位使用了多少内存。
23.分类数据类型
默认情况下,分类数据与对象数据类型一起存储。但是,这可能会导致不必要的内存使用,尤其是当分类变量的基数较低时。
低基数意味着与行数相比,一列具有很少的唯一值。例如,Geography
列具有3个唯一值和10000行。
我们可以通过将其数据类型更改为category
来节省内存。
df['Geography'] = df['Geography'].astype('category')
Geography
列的内存消耗减少了近8倍。
24.替换值
替换函数可用于替换DataFrame中的值。
第一个参数是要替换的值,第二个参数是新值。
我们可以使用字典进行多次替换。
25.绘制直方图
Pandas不是数据可视化库,但用它创建一些基本图形还是非常简单的。
我发现使用Pandas创建基本图比使用其他数据可视化库更容易。
让我们创建Balance
列的直方图。
df['Balance'].plot(kind='hist', figsize=(10,6),
title='Customer Balance')
由于Pandas不是数据可视化库,因此我不想详细介绍绘图。但是,Pandas 绘图[2]函数能够创建许多不同的图形,例如直线,条形图,kde,面积,散点图等等。
26.减少浮点数的小数点位数
Pandas的浮点数可能会显示过多的小数点。我们可以使用舍入函数轻松调整它。
df_new.round(1)#所需的小数位数
27.更改显示选项
无需每次都手动调整显示选项,我们可以更改各种参数的默认显示选项。
get_option:返回当前选项是什么 set_option:更改选项
让我们将小数点的显示选项更改为2。
pd.set_option("display.precision", 2)
您可能需要更改的其他一些选项是:
max_colwidth:列中显示的最大字符数 max_columns:要显示的最大列数 max_rows:要显示的最大行数
28.计算列中的百分比变化
pct_change
用于计算一系列值中的百分比变化。在计算元素的时间序列或顺序数组中的变化百分比时很有用。
从第一元素(4)到第二元素(5)的变化为%25,因此第二个值为0.25。
29.根据字符串过滤
我们可能需要根据文本数据(例如客户名称)过滤观察结果(行)。我已经将虚构名称添加到df_new DataFrame中。
让我们选择客户名称以Mi
开头的行。
我们将使用str访问器的startswith
方法。
df_new[df_new.Names.str.startswith('Mi')]
endswith
函数根据字符串末尾的字符进行相同的过滤。
Pandas可以对字符串进行很多操作。
30.样式化DataFrame
我们可以通过使用Style
属性来实现此目的,该属性返回一个styler
对象。它提供了许多用于格式化和显示DataFrame的选项。例如,我们可以突出显示最小值或最大值。
它还允许应用自定义样式函数。
df_new.style.highlight_max(axis = 0,
color ='darkgreen')
参考资料
客户流失数据集: https://www.kaggle.com/shubh0799/churn-modelling
[2]Pandas 绘图: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.html