面试题答案
一键面试-
分块读取
- 应用场景:在读取超大规模数据集时,比如处理数十亿行的CSV文件。例如读取一个非常大的销售记录CSV文件,文件包含多年来全球各地每一笔交易的详细信息。
- 应用方式:使用
pandas.read_csv
的chunksize
参数,将文件分块读取。例如:
import pandas as pd for chunk in pd.read_csv('large_sales_data.csv', chunksize = 10000): # 在这里对每一块数据进行处理,如计算每块的销售额总和 total_sales = chunk['sales_amount'].sum() print(total_sales)
- 性能提升原理:避免一次性将整个超大规模数据集读入内存,而是逐块读取和处理。这样可以显著减少内存占用,同时在某些情况下,如只需要对数据进行简单的统计分析时,可以在处理完一块数据后立即释放该块占用的内存,提高内存使用效率,加快处理速度。
-
选择合适的数据类型
- 应用场景:当数据集中某些列的数据类型与实际需求不符时,比如整数列被默认读取为浮点数,或者有一些布尔型数据被读取为对象类型。例如在一个用户信息表中,“是否订阅”列本应是布尔型,但可能被读成了对象类型,“年龄”列本应是整数类型,却被读成了浮点数类型。
- 应用方式:使用
astype
方法来转换数据类型。例如:
import pandas as pd data = pd.read_csv('user_info.csv') data['is_subscribed'] = data['is_subscribed'].astype('bool') data['age'] = data['age'].astype('int')
- 性能提升原理:合适的数据类型占用更少的内存空间。例如,布尔型数据在内存中只占1字节,而对象类型可能占用更多字节;整数类型比浮点数类型占用内存少。减少内存占用可以提高数据处理速度,特别是在处理大规模数据集时,内存占用的减少可以使更多的数据能够在内存中高效处理,减少磁盘I/O操作。
-
避免不必要的复制
- 应用场景:在数据处理过程中,很多操作可能会导致数据的隐式复制,例如在链式索引操作时。假设我们有一个包含员工信息的DataFrame,想要筛选出薪资大于一定值且在特定部门的员工,然后修改他们的奖金。
- 应用方式:尽量避免链式索引。例如,不要这样写:
data = pd.read_csv('employee_info.csv') sub_data = data[data['salary'] > 50000]['department'] == 'HR' sub_data['bonus'] = sub_data['bonus'] * 1.5 # 这可能会导致SettingWithCopyWarning,因为可能发生了不必要的复制
而应该使用布尔索引直接在原DataFrame上操作:
data = pd.read_csv('employee_info.csv') mask = (data['salary'] > 50000) & (data['department'] == 'HR') data.loc[mask, 'bonus'] = data.loc[mask, 'bonus'] * 1.5
- 性能提升原理:避免不必要的数据复制可以减少内存开销。每次数据复制都需要额外的内存来存储新的副本,对于大规模数据集,这种开销可能非常大。直接在原数据上进行操作,减少了内存的浪费,从而提高了性能。