pandas 将某一列转换为字符类型_6个提升效率的pandas小技巧

本文介绍了6个pandas数据分析的高效技巧,包括从剪切板创建DataFrame、按数据类型选择列、字符串转数字、处理缺失值、连续数据离散化以及从多个文件构建DataFrame。这些技巧有助于提升数据处理的效率和便利性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

a6c653bd8b838f0de7fcf7ab2b61eae2.gif

 文章来源:towardsdatascience 作者:B.Chen 翻译\编辑:Python大数据分析

pandas是python中常用的数据分析库,出现频率非常高,而且pandas功能之多让人咋舌,即使pandas老手也没法保证能高效使用pandas做数据分析。

这篇文章目的梳理几个高效实用的pandas小技巧,供大家参考。

1. 从剪切板中创建DataFrame

pandas中的read_clipboard()方法非常神奇,可以把剪切板中的数据变成dataframe格式,也就是说直接在excel中复制表格,可以快速转化为dataframe。

以下面这个excel数据表为例,全部选中,按ctrl+c复制:28fbe167d447202566d240e9725b1f94.png

然后在python中执行pd.read_clipboard(),就能得到一模一样的dataframe数据表:

pd.read_clipboard()
f4447db0fea3e0b3a8ddcef868515832.png

这功能对经常在excel和python中切换的分析师来说简直是福音,excel中的数据能一键转化为pandas可读格式。

2.  通过数据类型选择columns

数据分析过程可能会需要筛选数据列,比如只需要数值列,以经典的泰坦尼克数据集为例:

import seaborn as sns
# 导出泰坦尼克数据集
df = sns.load_dataset('titanic')
df.head()
524a4974abd9c00517c93d4449cae67b.png

查看该数据集各列的数据类型:

df.dtypes
ddfc8eda8d804190a5303145bfed8275.png

可以看到各列的数据类型不太一样,有int、object、float、bool等。

如果说我只要需要数值列,也就是数据类型为int、float的列,可以通过select_dtypes方法实现:

df.select_dtypes(include='number').head()
7cccf84d75a82bf24dd9515bd29e2f58.png

选择除数据类型为int外其他的列,注意这里的参数是exclude

df.select_dtypes(exclude='int').head()
238e1e0ab9c68dc0b326417f2da5d664.png

也可以选择多种数据类型:

df.select_dtypes(include=['int', 'datetime', 'object']).head()
dd299c3edbcf34c44fea6f61b43f555b.png

3. 将strings改为numbers

在pandas中,有两种方法可以将字符串改为数值:

  • astype()方法
  • to_numeric()方法

先创建一个样本dataframe,看看这两种方法有什么不同。

import pandas as pd
df = pd.DataFrame({ 'product': ['A','B','C','D'], 
                   'price': ['10','20','30','40'],
                   'sales': ['20','-','60','-']
                  })
df
37f23ddfcdc80b2b8d659ca9f41416f1.png

product列是字符串类型,price、sales列虽然内容有数字,但它们的数据类型也是字符串。

值得注意的是,price列都是数字,sales列有数字,但空值用-代替了。

df.dtypes
4c8c32b7b594fa8e85461f145bac0933.png

下面我们用astype()方法将price列的数据类型改为int:

df['price'] = df['price'].astype(int)
# 或者用另一种方式
df = df.astype({'price': 'int'})

但如果你同样用astype()方法更改sales列的话就会出现报错:

df['sales'] = df['sales'].astype(int)
7028f4d62ade4e91a343d01d8fc91e85.png

原因是sales列里面的内容除了数字外还有-,它是字符串,没办法转化为int

to_numeric()方法却可以解决这一问题,只需要设置参数errors='coerce'

df['sales'] = pd.to_numeric(df['sales'], errors='coerce')

df
dbf0e26f6adb69db729239c05a8a052d.png

现在sale列中的-已经被替换成了NaN,它的数据类型也变成了float

df.dtypes
ead55ed0626d6f5680e6db56d78c86fe.png

4. 检测并处理缺失值

有一种比较通用的检测缺失值的方法是info(),它可以统计每列非缺失值的数量。

还是用泰坦尼克数据集:

import seaborn as sns
# 导出泰坦尼克数据集
df = sns.load_dataset('titanic')
df.info()
50de01718056b9ebc94a4e33b26a2a92.png

标红色地方是有缺失值的列,并且给出了非缺失值的数量,你可以计算出该列有多少缺失值。

这样看可能不够直观,那可以用df.isnull().sum()方法很清楚地得到每列有多少缺失值:

df.isnull().sum()
1ab6bc0b1b3a1ece3abfc271fbdee9ec.png

df.isnull().sum().sum()则能够返回该数据集总共有多少缺失值:

df.isnull().sum().sum()
5836c7ea2477d1b40fb527018e93610e.png

还可以看缺失值在该列的占比是多少,用df.isna().mean()方法:

df.isna().mean()
de874d869610d2fdb7e63d36f67b88c5.png

注意:这里isnull()isna()使用效果一样。

那如何处理缺失值呢?

两种方式:删除和替换。

  • 删除包含缺失值的行:
df.dropna(axis = 0)
  • 删除包含缺失值的列:
df.dropna(axis = 1)
  • 如果一列里缺失值超过10%,则删除该列:
df.dropna(thresh=len(df)*0.9, axis=1)
  • 用一个标量替换缺失值:
df.fillna(value=10)
  • 用上一行对应位置的值替换缺失值:
df.fillna(axis=0, method='ffill')
  • 用前一列对应位置的值替换缺失值:
df.fillna(axis=1, method='ffill')
  • 用下一行对应位置的值替换缺失值:
df.fillna(axis=0, method='bfill')
  • 用后一列对应位置的值替换缺失值:
df.fillna(axis=1, method='bfill')
  • 使用某一列的平均值替换缺失值:
df['Age'].fillna(value=df['Age'].mean(), inplace=True)

当然你还可以用最大最小值、分位数值等来替换缺失值。

5. 对连续数据进行离散化处理

在数据准备过程中,常常会组合或者转换现有特征以创建一个新的特征,其中将连续数据离散化是非常重要的特征转化方式,也就是将数值变成类别特征。

同样以泰坦尼克数据集为例,里面有一列是年龄特征age:

import seaborn as sns
# 导出泰坦尼克数据集
df = sns.load_dataset('titanic')
df['age'].head()
3d1f15acaf8dfd00ed875378850e0b46.png

年龄是一段连续值,如果我们想对它进行分组变成分类特征,比如(<=12,儿童)、(<=18,青少年)、(<=60,成人)、(>60,老人),可以用cut方法实现:

import sys
df['ageGroup']=pd.cut(
                    df['age'], 
                    bins=[0, 13, 19, 61, sys.maxsize], 
                    labels=['儿童', '青少年', '成人', '老人']
                      )

df.head()
08feb51bfef6eb920fea628e2898f4c2.png

注意:这里的sys.maxsize是指可以存储的最大值。

可以看到新增了一列ageGroup,用以展示年龄分组:

df['ageGroup'].head()
f1ee5d48f0011b3624c5950f882bed26.png

6. 从多个文件中构建一个DataFrame

有时候数据集可能分布在多个excel或者csv文件中,但需要把它读取到一个DataFrame中,这样的需求该如何实现?

做法是分别读取这些文件,然后将多个dataframe组合到一起,变成一个dataframe。

这里使用内置的glob模块,来获取文件路径,简洁且更有效率。

4fb702545aca4862dbc052cd78390990.png

在上图中,glob()在指定目录中查找所有以“ data_row_”开头的CSV文件。

glob()以任意顺序返回文件名,这就是为什么使用sort()函数对列表进行排序的原因。

「行合并」

假设数据集按行分布在2个文件中,分别是data_row_1.csv和data_row_2.csv

63c87979155cb077b2a155d1ea2e92e3.png

用以下方法可以逐行合并:

files = sorted(glob('data/data_row_*.csv'))
pd.concat((pd.read_csv(file) for file in files), ignore_index=True)

sorted(glob('data/data_row_*.csv'))返回文件名,然后逐个读取,并且使用concat()方法进行合并,得到结果:

c496bfcd18380dda5e3b19c77992e4d1.png

「列合并」

假设数据集按列分布在2个文件中,分别是data_row_1.csv和data_row_2.csv

9879382d471b6f5a242a9cfd307df366.png

用以下方法可以逐列合并:

files = sorted(glob('data/data_col_*.csv'))
pd.concat((pd.read_csv(file) for file in files), axis=1)

sorted(glob('data/data_row_*.csv'))返回文件名,然后逐个读取,并且使用concat()方法进行列合并(注意这里axis=1),得到结果:

fa2cacd8325a73220aaf2b2a861df84c.png

本文就到这里,pandas还有很多让人惊喜的小技巧,大家有兴趣也可以在评论区说说你的使用心得。


添加微信号" sshs321 "加入技术交流群

29e9f72bb5b245dbaf2c36462bcef96d.png

0fe1d0c8418b10f0c1d523f0444b49ca.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值