Pandas常用操作

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))

Balance hist

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函数。

df.Geography.value_counts().size
df.Geography.nunique()

22.内存使用

只需通过memory_usage函数即可完成。

这些值显示以字节为单位使用了多少内存。

df.memory_usage()

23.分类数据类型

默认情况下,分类数据与对象数据类型一起存储。但是,这可能会导致不必要的内存使用,尤其是当分类变量的基数较低时。

低基数意味着与行数相比,一列具有很少的唯一值。例如,Geography列具有3个唯一值和10000行。

我们可以通过将其数据类型更改为category来节省内存。

df['Geography'] = df['Geography'].astype('category')

Geography列的内存消耗减少了近8倍。

24.替换值

替换函数可用于替换DataFrame中的值。

df_new['Group'].replace(0:'B1')

第一个参数是要替换的值,第二个参数是新值。

我们可以使用字典进行多次替换。

df_new['Group'].replace({0:'B1',1:'B2'})

25.绘制直方图

Pandas不是数据可视化库,但用它创建一些基本图形还是非常简单的。

我发现使用Pandas创建基本图比使用其他数据可视化库更容易。

让我们创建Balance列的直方图。

df['Balance'].plot(kind='hist', figsize=(10,6),   
title='Customer Balance')

由于Pandas不是数据可视化库,因此我不想详细介绍绘图。但是,Pandas 绘图[2]函数能够创建许多不同的图形,例如直线,条形图,kde,面积,散点图等等。

26.减少浮点数的小数点位数

Pandas的浮点数可能会显示过多的小数点。我们可以使用舍入函数轻松调整它。

df_new.round1)#所需的小数位数

27.更改显示选项

无需每次都手动调整显示选项,我们可以更改各种参数的默认显示选项。

  • get_option:返回当前选项是什么
  • set_option:更改选项

让我们将小数点的显示选项更改为2。

pd.set_option("display.precision", 2)

您可能需要更改的其他一些选项是:

  • max_colwidth:列中显示的最大字符数
  • max_columns:要显示的最大列数
  • max_rows:要显示的最大行数

28.计算列中的百分比变化

pct_change用于计算一系列值中的百分比变化。在计算元素的时间序列或顺序数组中的变化百分比时很有用。

ser = pd.Series([4,5,2,5,6,10,12])
ser.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'

参考资料
[1]客户流失数据集: https://www.kaggle.com/shubh0799/churn-modelling

[2]Pandas 绘图: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笼中小夜莺

嘿嘿嘿,请用金钱尽情地蹂躏我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值