10个Python数据处理核心技巧:从入门到精通
本文介绍10个Python中pandas库的高效使用技巧,涵盖数据读取、类型选择、深拷贝、映射转换、apply性能优化、值计数、缺失值处理、ID筛选、分箱及CSV导出等核心场景,帮助开发者提升数据处理效率。
Python数据处理核心技巧概览
pandas是基于numpy构建的高级数据结构和操作工具,旨在让数据分析工作更加高效和便捷。本文整理了10个实用的Python数据处理技巧,掌握这些方法有助于提升开发效率,快速进阶。

高效读取与预处理:read_csv与select_dtypes
1. read_csv
虽然这个命令广为人知,但在处理大型数据集时,建议添加参数 nrows = 5,以便在加载完整数据前仅读取前几行进行预览。此外,可以通过指定错误的分隔符来测试并避免潜在错误(数据不一定总是以逗号分隔)。
或者,在Linux系统中可以使用 'head' 命令检查文本文件的前几行,例如执行 head -c 5 data.txt。
随后,可以使用 df.columns.tolist() 提取所有列名,并通过添加 usecols = ['c1', 'c2', ...] 参数来只加载需要的列。如果已知某些特定列的数据类型,还可以添加 dtype = {'c1': str, 'c2': int, ...} 参数以加速数据加载。此参数还有一个好处:如果某列同时包含字符串和数字,将其声明为字符串类型可以避免在尝试将该列作为键合并表格时出错。
2. select_dtypes
如果在Python中进行数据预处理,这个命令能节省大量时间。读取表格后,每列的默认数据类型可能是 bool、int64、float64、object、category、timedelta64 或 datetime64。你可以先查看
df.dtypes.value_counts()
命令分发的结果以了解数据帧的所有可能数据类型,然后执行
df.select_dtypes(include = ['float64','int64'])
选择仅具有数字特征的子数据帧。
数据复制与映射转换:Copy与Map
3. Copy
这是一个重要的命令。如果执行以下命令:
import pandas as pd
df1 = pd.DataFrame({ ‘a':[0,0,0], ‘b': [1,1,1]})
df2 = df1
df2[‘a'] = df2[‘a'] + 1
df1.head()
你会发现 df1 已经改变了。这是因为 df2 = df1 并没有复制 df1 的值并分配给 df2,而是设置了指向 df1 的指针。因此,对 df2 的任何修改都会导致 df1 发生变化。要解决这个问题,你可以:
df2
= df1.copy()
br
或者
from copy import deepcopy
df2 = deepcopy(df1)
4. Map
这是一个可以进行简单数据转换的命令。首先定义一个字典,其中 'keys' 是旧值,'values' 是新值。
level_map = {1: ‘high', 2: ‘medium', 3: ‘low'}
df[‘c_level'] = df[‘c'].map(level_map)
性能优化:apply的使用与替代方案
举几个例子:将 True、False 转换为 1、0(用于建模);定义水平等级;用户自定义的词法编码。
5. apply or not apply?
如果我们想创建一个新的列,并将其他列作为输入,那么 apply 函数有时非常有用。
def rule(x, y):
if x == ‘high' and y > 10:
return 1
else:
return 0
df = pd.DataFrame({ 'c1':[ 'high' ,'high', 'low', 'low'], 'c2': [0, 23, 17, 4]})
df['new'] = df.apply(lambda x: rule(x['c1'], x['c2']), axis = 1)
df.head()
在上面的代码中,我们定义了一个带有两个输入变量的函数,并使用 apply 函数将其应用于列 'c1' 和 'c2'。
但“apply函数”的问题是它有时太慢了。如果你想计算两列“c1”和“c2”的最大值,你可以:
df[‘maximum'] = df.apply(lambda x: max(x[‘c1'], x[‘c2']), axis = 1)
但你会发现它比这个命令慢得多:
df[‘maximum'] = df[[‘c1','c2']].max(axis =1)
数据分布与缺失值处理:value_counts与缺失值统计
注意:如果可以使用其他内置函数完成相同的工作(它们通常更快),请不要使用 apply。例如,如果要将列 'c' 舍入为整数,请执行 round(df['c'], 0) 而非使用 apply 函数:
df.apply(lambda x: round(x['c'], 0), axis = 1)
6. value counts
这是一个检查值分布的命令。例如,如果你想检查“c”列中每个值的可能值和频率,可以执行以下操作
df[‘c'].value_counts()
它有一些有用的技巧/参数:
A. normalize = True:如果你要检查频率而不是计数。
B. dropna = False:如果你要统计数据中包含的缺失值。
C. df['c'].value_counts().reset_index():如果你想将stats表转换成pandas数据帧并进行操作。
D. df['c'].value_counts().reset_index().sort_values(by='index'):显示按值而不是按计数排序的统计数据。
7. 缺失值的数量
数据筛选与分箱:ID选择与Percentile groups
构建模型时,你可能希望排除具有很多缺失值或全是缺失值的行。你可以使用 .isnull() 和 .sum() 来计算指定列中缺失值的数量。
import pandas as pd
import numpy as np
df = pd.DataFrame({ ‘id': [1,2,3], ‘c1':[0,0,np.nan], ‘c2': [np.nan,1,1]})
dfdf = df[[‘id', ‘c1', ‘c2']]
df[‘num_nulls'] = df[[‘c1', ‘c2']].isnull().sum(axis=1)
df.head()
8. 选择具有特定ID的行
在SQL中,我们可以使用 SELECT * FROM ... WHERE ID('A001','C022',...) 来获取具有特定ID的记录。如果想用Pandas做同样的事情,你可以
dfdf_filter = df[‘ID'].isin([‘A001',‘C022',...])
df[df_filter]
9. Percentile groups
你有一个数字列,并希望将该列中的值分类为组,例如将列的前5%分为组1,前5-20%分为组2,前20%-50%分为组3,最后50%分为组4。当然,你可以用pandas.cut来做,但这里提供另一个选择:
import numpy as np
cut_points = [np.percentile(df[‘c'], i) for i in [50, 80, 95]]
df[‘group'] = 1
for i in range(3):
df[‘group'] = df[‘group'] + (df[‘c'] < cut_points[i])
# or <= cut_points[i]
数据导出技巧:to_csv的高级用法
这个指令使计算机运行的非常快(没有使用应用功能)。
10. to_csv
这也是每个人都会使用的命令。这里指出两个技巧。第一个是
print(df[:5].to_csv())
你可以使用此命令准确地打印出写入文件的前五行数据。
另一个技巧是处理混合在一起的整数和缺失值。如果列同时包含缺失值和整数,则数据类型仍将是 float 而不是 int。导出表时,可以添加 float_format ='%。0f' 将所有浮点数舍入为整数。如果只想要所有列的整数输出,请使用此技巧,你将摆脱所有令人苦恼的 '.0'。
总结
以上所述是小编给大家介绍的10招!看骨灰级Pythoner玩转Python的方法,希望对大家有所帮助。如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对本站网站的支持! 如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













