Python面试题大合集!数据分析师必看的60道经典题目 原创

发布于 2025-7-24 09:04
浏览
0收藏

作为一名数据分析师,Python几乎是必备的技能。它不仅简单易读,还拥有强大的库支持,无论是数据处理、可视化还是机器学习,Python都能轻松搞定。今天,就给大家带来一份超全的Python面试题合集,涵盖初级、中级和高级,帮你轻松应对面试,快来看看吧!

一、初级Python面试题

1. Python是什么?为什么在数据分析中这么火?

Python是一种简单易读的高级编程语言。它之所以在数据分析中广泛应用,主要得益于强大的库支持,比如Pandas、NumPy用于数据处理,Matplotlib和Seaborn用于数据可视化。有了这些工具,数据分析师可以快速开发原型,并且Python还能轻松和其他技术、数据库集成,简直是数据分析的“瑞士军刀”。

2. 怎么安装外部库和管理环境?

安装库用pip就行,比如​​pip install pandas numpy​​​。要是想管理环境,防止依赖冲突,可以用​​venv​​​或者​​conda​​​。比如用​​venv​​创建环境后,激活它就能在独立的环境中安装和使用库了,不用担心和其他项目的库冲突。

3. Python的主要数据类型有哪些?它们有什么区别?

Python有好几种常用的数据类型。​​int​​​和​​float​​​是数字类型,​​str​​​用来表示文本,​​bool​​​就是布尔值,只有​​True​​​和​​False​​​。还有​​list​​​,它是有序的、可变的,比如​​[1, 2, 3]​​​;​​tuple​​​也是有序的,但它是不可变的,像​​(1, 2, 3)​​​;​​set​​​是无序的,里面的元素都是唯一的,例如​​{1, 2, 3}​​​;​​dict​​​是键值对的形式,比如​​{"name": "Alice", "age": 30}​​,通过键可以快速查找对应的值。

4. 列表、元组和集合有什么不同?

列表是可变的,你可以随时修改里面的元素,而且它是有序的。元组和列表很像,但它是不可变的,一旦创建就不能修改。集合是无序的,里面的元素都是唯一的,适合用来做唯一性检查。比如,如果你需要一个数据列表,可能会频繁修改,那就用列表;如果数据是固定的,不会变,就用元组;要是想检查数据中有没有重复的元素,集合就派上用场了。

5. Pandas的Series和DataFrame是什么?

Pandas的Series就像是一个一维的带标签的数组,比如你可以用它来存储一列数据。DataFrame就更强大了,它是二维的,有行和列,每一列都有标签,就像一个表格一样,适合用来存储结构化的数据,比如一个包含多列数据的表格。

6. 怎么用Pandas读取CSV文件?

这个很简单,只需要几行代码就行。​​import pandas as pd​​​,然后用​​df = pd.read_csv("data.csv")​​,就能把CSV文件读取到一个DataFrame里了。你还可以根据需要设置分隔符、表头、列名等参数,很方便。

7. type()函数有什么用?

​type()​​​函数可以帮你查看一个变量的数据类型。比如​​type(42)​​​会返回​​int​​​,​​type("abc")​​​会返回​​str​​,这样你就能清楚地知道变量是什么类型,方便后续操作。

8. if、elif和else在Python中怎么用?

这三个是用来做决策的。比如你想判断一个数是正数、负数还是零,就可以用​​if x > 0:​​​,然后打印“Positive”;​​elif x < 0:​​​,打印“Negative”;最后用​​else:​​,打印“Zero”。这样就能根据不同的条件执行不同的操作。

9. 怎么处理DataFrame中的缺失值?

处理缺失值有好几种方法。你可以用​​isnull()​​​来找出哪些地方有缺失值,然后用​​dropna()​​​把缺失值所在的行或者列直接删除,或者用​​fillna()​​把缺失值替换为某个值,比如0或者平均值,具体怎么处理要看你的数据和需求。

10. 什么是列表推导式?举个例子。

列表推导式是一种很简洁的创建列表的方法。比如你想生成一个包含前5个数的平方的列表,就可以用​​[x**2 for x in range(5)]​​​,这样就能快速生成​​[0, 1, 4, 9, 16]​​这样的列表,比传统的循环方法更简洁。

11. 怎么在Pandas DataFrame中过滤行?

你可以用布尔索引来过滤行。比如你想筛选出DataFrame中年龄大于30的行,就可以用​​df[df['age'] > 30]​​,这样就会返回符合条件的行,很方便。

​12. Python中​​​is​​​和​​​==​​​有什么区别?​

​==​​​是用来比较两个值是否相等的,比如​​x == y​​​,如果​​x​​​和​​y​​​的值一样,就会返回​​True​​​。而​​is​​​是用来比较两个对象在内存中是否是同一个对象,比如​​x is y​​​,只有当​​x​​​和​​y​​​指向同一个内存地址时才会返回​​True​​。

13. len()函数在Python中有什么用?

​len()​​​函数可以返回一个对象的元素个数。比如​​len([1, 2, 3])​​​就会返回​​3​​,告诉你这个列表有3个元素,很方便用来统计数据的长度。

14. 怎么在Pandas中排序数据?

在Pandas中,你可以用​​sort_values()​​​函数来排序数据。比如你想按照某列的值对DataFrame进行排序,就可以用​​df.sort_values(by='column_name')​​​,这样就能按照指定列的值进行升序排序,如果需要降序,还可以加上参数​​ascending=False​​。

15. Python中的字典是什么?

字典是一种键值对的集合,通过键可以快速查找对应的值。比如​​{"name": "Alice", "age": 30}​​​,你可以用​​"name"​​​这个键来获取​​"Alice"​​这个值,很方便用来存储和查找数据。

16. append()和extend()有什么区别?

​append()​​​方法是把一个元素添加到列表的末尾。比如​​lst.append([4,5])​​​,就会把​​[4,5]​​​作为一个整体添加到​​lst​​​的末尾,结果是​​[[1,2,3],[4,5]]​​​。而​​extend()​​​方法是把多个元素添加到列表的末尾,比如​​lst.extend([4,5])​​​,就会把​​4​​​和​​5​​​分别添加到​​lst​​​的末尾,结果是​​[1,2,3,4,5]​​。

17. 怎么在Pandas中把一列转换为日期时间格式?

你可以用​​pd.to_datetime()​​​函数来转换。比如​​df['date'] = pd.to_datetime(df['date'])​​​,这样就能把​​date​​列转换为日期时间格式,方便后续进行日期相关的操作。

​18. Python中的​​​in​​运算符有什么用?​

​in​​​运算符可以用来检查一个字符是否在一个值中。比如​​"a" in "data"​​​,就会返回​​True​​​,因为它检查到​​"a"​​​是​​"data"​​中的一个字符,很方便用来判断字符串中是否包含某个字符。

​19. ​​​break​​​、​​​continue​​​和​​​pass​​​有什么区别?​

在Python中,​​break​​​是用来退出循环的,比如在一个​​for​​​循环中,一旦遇到​​break​​​,循环就会直接结束。​​continue​​​是用来跳过当前循环的这一次迭代,直接进入下一次迭代。而​​pass​​是一个占位符,它什么也不做,通常用在需要语法上有一个语句,但又不需要执行任何操作的时候。

20. Python中的缩进有什么作用?

Python用缩进来定义代码块。和其他语言用大括号​​{}​​​来区分代码块不同,Python靠缩进来表示代码的层次结构。如果你的缩进不正确,程序就会报​​IndentationError​​错误,所以一定要注意缩进的正确性。

二、中级Python面试题

​21. Pandas中的​​​loc​​​和​​​iloc​​​有什么区别?​

​loc​​​是基于标签的,你可以用它来通过行名或者列名来访问数据。比如​​df.loc['row_name', 'column_name']​​​。而​​iloc​​​是基于整数位置的,它通过行号和列号来访问数据,比如​​df.iloc[0, 1]​​,表示访问第1行第2列的数据。

22. 浅拷贝和深拷贝有什么区别?

浅拷贝创建了一个新的对象,但它里面的元素只是原来对象元素的引用。比如你有一个列表​​lst = [[1, 2], [3, 4]]​​​,用浅拷贝​​new_lst = lst.copy()​​​,​​new_lst​​​和​​lst​​​指向同一个列表,但里面的子列表还是原来的子列表。而深拷贝会创建一个完全独立的副本,包括所有嵌套的元素。比如用​​copy.deepcopy(lst)​​,就会创建一个全新的列表,里面的子列表也是全新的,不会和原来的列表共享元素。

​23. Pandas中的​​​groupby()​​有什么作用?​

​groupby()​​​函数可以把数据按照某个标准分成不同的组,然后对每个组应用一个函数,比如求平均值、求和等。比如你有一个包含销售数据的DataFrame,你可以用​​df.groupby('category').mean()​​,按照产品类别分组,然后计算每个类别的平均销售额,很方便用来做数据的聚合和转换操作。

​24. Pandas中的​​​merge()​​​、​​​join()​​​和​​​concat()​​​有什么区别?​

​merge()​​​函数是用来合并两个DataFrame的,它类似于SQL中的连接操作,可以根据键值进行内连接、外连接等操作。比如​​df1.merge(df2, on='key')​​​,就是根据​​key​​​列把​​df1​​​和​​df2​​​合并起来。​​join()​​​函数也是用来合并的,但它主要是根据索引或者键列来进行合并,比如​​df1.join(df2, on='key')​​​。而​​concat()​​​函数就更简单了,它只是简单地把多个DataFrame沿着某个轴拼接起来,比如​​pd.concat([df1, df2], axis=0)​​​,就是把​​df1​​​和​​df2​​沿着行拼接起来。

25. NumPy中的广播机制是什么?

广播机制允许不同形状的数组进行算术运算。比如你有一个形状为​​(3, 1)​​​的数组和一个形状为​​(1, 3)​​​的数组,NumPy会自动把它们扩展为​​(3, 3)​​的形状,然后进行逐元素的运算,这样就不用手动复制数组,节省了内存,也提高了计算效率。

26. Python是怎么管理内存的?

Python主要通过引用计数和垃圾回收器来管理内存。每个对象都有一个引用计数,当一个对象的引用计数变为0时,垃圾回收器就会回收这个对象占用的内存,这样就能自动释放不再使用的内存,避免内存泄漏。

27. 怎么处理DataFrame中的重复值?

你可以用​​df.duplicated()​​​来找出重复的行,然后用​​df.drop_duplicates()​​​来删除重复的行。如果你只想在某些列上检查重复值,还可以指定​​subset​​​参数,比如​​df.drop_duplicates(subset=['column1', 'column2'])​​,这样就只会根据这两列来判断重复。

28. 怎么对DataFrame的一列应用自定义函数?

你可以用​​apply()​​​方法来对DataFrame的一列应用自定义函数。比如你想把一列的每个值都乘以2,就可以用​​df['col'] = df['col'].apply(lambda x: x * 2)​​,这样就能快速对整列数据进行操作。

​29. Pandas中的​​​apply()​​​、​​​map()​​​和​​​applymap()​​​有什么区别?​

​apply()​​​方法是用来对DataFrame的行或者列进行操作的。比如​​df.apply(lambda x: x.sum(), axis=1)​​​,就是对每一行求和。​​map()​​​方法是针对Series的,它可以对Series中的每个元素进行操作,比如​​df['col'].map(lambda x: x * 2)​​​。而​​applymap()​​​方法是针对整个DataFrame的,它可以对DataFrame中的每个元素进行操作,比如​​df.applymap(lambda x: x * 2)​​。

30. NumPy和Pandas中的向量化是什么?

向量化是一种操作方式,它允许你在整个数组或者DataFrame上直接进行运算,而不需要写循环。比如你想把一个数组的所有元素都加1,直接用​​array + 1​​就行,而不需要用循环一个个加。这样不仅代码更简洁,而且运行速度也更快,因为向量化操作是用底层的优化过的代码实现的。

31. 怎么在Pandas中对时间序列数据进行重采样?

你可以用​​resample()​​​函数来对时间序列数据进行重采样。比如你有一个按天记录的数据,你想把它转换为按月平均值,就可以用​​df.resample('M').mean()​​,这样就能把数据按照月份进行分组,然后计算每个月的平均值。

​32. Pandas中的​​​any()​​​和​​​all()​​​有什么区别?​

​any()​​​函数是用来检查是否至少有一个元素为​​True​​​的。比如​​df['col'].any()​​​,如果​​col​​​列中至少有一个非零值或者非空值,就会返回​​True​​​。而​​all()​​​函数是用来检查是否所有元素都为​​True​​​的,只有当​​col​​​列中的所有值都不为零或者不为空时,才会返回​​True​​。

33. 怎么改变DataFrame中一列的数据类型?

你可以用​​astype()​​​函数来改变数据类型。比如你想把一列的数据类型从字符串转换为浮点数,就可以用​​df['col'] = df['col'].astype('float')​​,这样就能快速转换数据类型,方便后续的计算。

34. Pandas支持哪些文件格式?

Pandas支持的文件格式可多了,包括CSV、Excel、JSON、HTML、SQL、HDF5、Feather和Parquet等。你可以用Pandas很方便地读取和写入这些文件格式,比如​​pd.read_csv()​​​、​​pd.read_excel()​​​、​​df.to_json()​​等,这样就能轻松处理各种数据源。

35. lambda函数是什么?怎么用?

lambda函数是一种匿名函数,它可以用一行代码定义一个简单的函数。比如​​square = lambda x: x ** 2​​​,这就定义了一个计算平方的函数,你可以直接用​​square(3)​​来计算3的平方,很方便用来定义一些简单的操作。

​36. ​​​zip()​​​和​​​enumerate()​​​函数有什么用?​

​zip()​​​函数可以把两个可迭代对象的元素一一对应地组合起来。比如​​zip([1, 2, 3], ['a', 'b', 'c'])​​​,就会得到一个包含​​(1, 'a')​​​、​​(2, 'b')​​​、​​(3, 'c')​​​的迭代器。而​​enumerate()​​​函数可以把一个可迭代对象的元素和它的索引组合起来,比如​​enumerate(['a', 'b', 'c'])​​​,就会得到一个包含​​(0, 'a')​​​、​​(1, 'b')​​​、​​(2, 'c')​​的迭代器,这两个函数在循环中很有用。

37. Python中的异常是什么?怎么处理?

异常就是程序运行时出现的错误。比如你尝试除以零、访问不存在的文件或者引用未定义的变量,都会引发异常。你可以用​​try-except​​块来捕获异常,比如:

try:
    result = 10 / 0
except ZeroDivisionError:
    print("Cannot divide by zero")

这样就能在出现除零错误时打印一条友好的提示信息,而不是让程序直接崩溃。你还可以用​​finally​​​块来清理资源,比如关闭文件,即使发生异常也会执行。另外,你还可以用​​raise​​来抛出自定义的异常,方便调试和错误处理。

​38. Python中的​​​*args​​​和​​​**kwargs​​​是什么?​

​*args​​​和​​**kwargs​​​是用来传递可变数量的参数的。​​*args​​​可以传递任意数量的位置参数,比如​​def func(*args)​​​,你可以用​​func(1, 2, 3)​​​来调用它,​​args​​​会是一个包含​​1​​​、​​2​​​、​​3​​​的元组。而​​**kwargs​​​可以传递任意数量的关键字参数,比如​​def func(**kwargs)​​​,你可以用​​func(a=1, b=2)​​​来调用它,​​kwargs​​​会是一个包含​​{'a': 1, 'b': 2}​​的字典,这样就能让函数更灵活地接受不同数量和类型的参数。

39. 怎么处理Pandas中一列的混合数据类型?

在Pandas中,一列最好只有一种数据类型,比如全是整数或者全是字符串。但有时候数据可能会很乱,比如有些行是数字,有些行是字符串,或者还有空值。这种情况下,Pandas会把这一列的数据类型设置为​​object​​,这可能会导致性能下降,还可能会让一些类型相关的操作出错,比如计算平均值或者字符串操作。

要解决这个问题,你可以用​​df['column'].astype()​​​来把整列转换为期望的数据类型,比如​​df['column'].astype('float')​​​。如果有些值不能转换为浮点数,你可以用​​pd.to_numeric(df['column'], errors='coerce')​​​,它会把能转换的值转换为数字,不能转换的值会变成​​NaN​​​,这样你就可以进一步清理数据,比如用​​fillna()​​​填充空值,或者用​​dropna()​​删除空值,让数据更干净、更规范。

​40. Pandas中的​​​value_counts()​​​和​​​groupby().count()​​​有什么区别?​

​value_counts()​​​是用来统计Series中每个唯一值的出现次数的。比如​​df['Gender'].value_counts()​​​,就会返回一个Series,告诉你​​Gender​​​列中​​Male​​​和​​Female​​各有多少个,很方便用来分析单列数据的分布情况。

而​​groupby().count()​​​是用来对DataFrame进行分组统计的。比如​​df.groupby('Department').count()​​​,它会按照​​Department​​列的值分组,然后统计每个组中每列的非空值个数,返回一个DataFrame,这样你就能看到每个部门中各个字段的数据量,适合用来分析多列数据在不同分组下的情况。

41. Python中的装饰器是什么?举个例子

装饰器是一种很强大的功能,它可以让一个函数在不修改原有代码的情况下,增加新的功能。比如你想给一个函数添加日志功能,就可以定义一个装饰器:

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__}")
        return func(*args, **kwargs)
    return wrapper

@log_decorator
def say_hello():
    print("Hello!")

这样,当你调用​​say_hello()​​的时候,它不仅会打印“Hello!”,还会打印一条日志信息“Calling say_hello”,很方便用来做日志记录、性能监控或者权限控制等功能。

42. Python中的生成器是什么?和普通函数有什么区别?

生成器是一种特殊的函数,它用​​yield​​​关键字来返回值,而不是用​​return​​​。生成器返回的是一个迭代器,它会在每次调用​​next()​​的时候生成一个值,而不是一次性生成所有值。比如:

def my_generator():
    yield 1
    yield 2
    yield 3

你可以用​​for num in my_generator():​​​来遍历生成器,它会依次生成​​1​​​、​​2​​​、​​3​​。和普通函数相比,生成器最大的好处是节省内存,因为它不需要一次性把所有值都存储在内存中,特别适合处理大数据或者无限序列。

43. 怎么分析和优化Python代码的性能?

分析代码性能可以用一些工具,比如​​cProfile​​​可以对整个代码进行性能分析,​​timeit​​​可以测量代码片段的运行时间,​​line_profiler​​可以逐行分析代码的性能瓶颈。优化代码的方法有很多,比如减少代码的复杂度,尽量用向量化操作代替循环,缓存计算结果避免重复计算等,这些方法都能让代码运行得更快。

44. Python中的上下文管理器是什么?有什么用?

上下文管理器是一种很方便的语法,它可以用​​with​​语句来管理资源。比如打开文件的时候,你可以用:

with open('file.txt') as f:
    data = f.read()

这样,文件会在​​with​​块结束的时候自动关闭,即使中间发生异常也会正常关闭,不用担心文件泄漏。上下文管理器还可以用来管理数据库连接、锁等资源,确保资源在使用后能正确释放。

​45. 怎么处理缺失数据?什么时候用​​​dropna()​​​和​​​fillna()​​​?​

处理缺失数据主要有两种方法。​​dropna()​​​是直接删除包含缺失值的行或者列,这种方法适合缺失数据比较少,而且缺失数据对整体分析影响不大的情况。比如你有一个很大的数据集,只有少数几行有缺失值,而且这些缺失值不会影响整体的趋势,就可以用​​dropna()​​直接删除。

​fillna()​​是用某个值来填充缺失值,这种方法适合缺失数据比较多,或者缺失数据对整体分析很重要,不能简单删除的情况。比如你可以用平均值、中位数或者某个特定的值来填充缺失值,也可以用插值方法根据周围的值来估算缺失值,这样就能保留更多的数据,让分析更准确。

46. Python的内存管理模型是什么?

Python的内存管理主要靠引用计数和循环垃圾回收器。每个对象都有一个引用计数,当一个对象的引用计数变为0的时候,垃圾回收器就会回收这个对象占用的内存。另外,Python还有一个循环垃圾回收器,它可以检测并回收那些相互引用导致引用计数无法归零的对象,这样就能有效地管理内存,避免内存泄漏。

47. Python中的多线程和多进程有什么区别?

多线程适合处理I/O密集型任务,比如文件读写、网络请求等。它可以在一个程序中同时运行多个线程,看起来像是同时在做很多事情,但实际上由于Python的全局解释器锁(GIL),同一时间只有一个线程可以执行Python代码,所以多线程在CPU密集型任务上效率不高。

多进程就不同了,它可以在多个CPU核心上同时运行多个进程,每个进程都有自己独立的内存空间,适合处理CPU密集型任务,比如计算密集型的算法。因为每个进程可以独立运行,所以它不受GIL的限制,能充分利用多核CPU的优势。

48. 怎么用NumPy广播机制提高性能?

NumPy的广播机制可以让不同形状的数组进行运算,而不需要复制数据。比如你有一个形状为​​(3, 1)​​​的数组和一个形状为​​(1, 3)​​​的数组,NumPy会自动把它们扩展为​​(3, 3)​​的形状,然后进行逐元素的运算。这样不仅节省了内存,因为不需要复制数组,还提高了计算效率,因为广播机制是用底层的优化过的代码实现的。

49. 写高效Pandas代码的最佳实践有哪些?

写高效Pandas代码有很多技巧。比如尽量用向量化操作代替循环,因为向量化操作是用底层的优化过的代码实现的,比循环快得多。还有,尽量避免使用​​.apply()​​​方法,因为它本质上还是循环,可以用向量化操作或者内置函数来替代。另外,要尽量减少链式索引,因为链式索引可能会导致数据复制,增加内存使用量。如果数据中有重复的字符串,可以用​​categorical​​类型来代替,这样可以节省内存,提高性能。

50. 怎么处理不适合放在内存中的大数据集?

如果数据太大,不能一次性放进内存,你可以用一些方法来处理。比如用​​pd.read_csv()​​​的​​chunksize​​参数,可以分块读取CSV文件,每次只处理一小块数据。还可以用Dask库,它是一个并行计算库,可以自动把大数据集分成小块,然后并行处理,最后再把结果合并起来。另外,你也可以用迭代的方式,每次只加载数据的一个子集,这样就能处理比内存大得多的数据集。

51. 怎么处理不平衡的数据集?

不平衡的数据集是指某个类别的数据量远远大于其他类别的数据量。处理这种数据集有几种方法。一种是过采样,比如SMOTE算法,它可以通过插值等方式增加少数类别的数据量,让数据集更平衡。另一种是欠采样,就是从多数类别中随机抽取一部分数据,减少多数类别的数据量。还可以用一些支持类别权重的算法,比如在训练模型的时候,给少数类别更高的权重,这样模型就会更关注少数类别,提高分类效果。

​52. Pandas中的​​​.loc[]​​​、​​​.iloc[]​​​和​​​.ix[]​​​有什么区别?​

​.loc[]​​​是基于标签的索引,你可以用它来通过行名或者列名来访问数据。比如​​df.loc['row_name', 'column_name']​​​。​​.iloc[]​​​是基于整数位置的索引,它通过行号和列号来访问数据,比如​​df.iloc[0, 1]​​​。而​​.ix[]​​已经被废弃了,不推荐使用,因为它容易让人混淆,而且在某些情况下可能会出现意外的结果。

53. Python数据分析中的常见性能陷阱有哪些?

在Python数据分析中,有一些常见的性能陷阱。比如,很多人会用循环来处理数据,但实际上循环很慢,应该尽量用向量化操作来替代。还有,有时候会不小心复制了很大的DataFrame,比如用​​df = df.copy()​​​,这样会占用更多的内存,其实很多时候不需要复制整个DataFrame。另外,要注意数据类型的内存占用,比如用​​float64​​​类型存储的数据比用​​float32​​类型占用的内存多,如果数据精度要求不高,可以用更小的数据类型来节省内存。

54. 怎么在Python中序列化和反序列化对象?

序列化就是把对象转换为可以存储或者传输的格式,反序列化就是把序列化的数据还原为对象。在Python中,可以用​​pickle​​模块来序列化和反序列化Python对象。比如:

import pickle
pickle.dump(obj, open('file.pkl', 'wb'))
obj = pickle.load(open('file.pkl', 'rb'))

这样就可以把对象​​obj​​​保存到文件中,也可以从文件中加载回来。如果需要和其他语言交互,可以用​​json​​模块,它可以把对象转换为JSON格式,方便和其他语言共享数据。

55. 怎么在Python中处理分类变量?

处理分类变量有几种方法。可以用​​LabelEncoder​​​,它会把分类变量转换为整数标签,比如​​Male​​​和​​Female​​​会被转换为​​0​​​和​​1​​​。还可以用​​OneHotEncoder​​​,它会把分类变量转换为独热编码,比如一个有三个类别的变量会被转换为三个二进制列。另外,Pandas的​​pd.get_dummies()​​也可以用来做独热编码,很方便用来处理分类变量,让它们更适合机器学习算法。

​56. Pandas中​​​Series.map()​​​和​​​Series.replace()​​​有什么区别?​

​Series.map()​​​是用来对Series中的每个元素应用一个映射或者函数的。比如你有一个Series,你想把里面的值​​A​​​映射为​​1​​​,​​B​​​映射为​​2​​​,就可以用​​Series.map({'A': 1, 'B': 2})​​​。而​​Series.replace()​​​是用来替换Series中的值的,比如你想把​​A​​​替换为​​1​​​,​​B​​​替换为​​2​​​,就可以用​​Series.replace({'A': 1, 'B': 2})​​​。虽然它们看起来很像,但​​map()​​​更灵活,可以应用函数,而​​replace()​​更适合直接替换值。

57. 怎么用Python设计一个ETL管道?

ETL管道就是数据抽取(Extract)、转换(Transform)和加载(Load)的过程。抽取阶段,你可以用Pandas、​​requests​​​或者​​sqlalchemy​​​等工具从API、CSV文件或者数据库中获取数据。转换阶段,你可以用Pandas和NumPy来清洗数据,比如处理空值、解析日期、合并数据集、衍生新列等。加载阶段,你可以把处理好的数据写入数据库,比如用​​to_sql()​​,或者导出为CSV、Parquet等文件格式。

为了自动化和监控ETL管道,可以用Airflow这样的工具来调度任务,也可以用简单的脚本加上日志和异常处理来确保管道的健壮性和可扩展性。

58. 怎么在Python中实现日志记录?

在Python中,可以用​​logging​​模块来记录日志。比如:

import logging
logging.basicConfig(level=logging.INFO)
logging.info("Script started")

这样就可以记录日志信息了。你可以设置日志的级别,比如​​INFO​​​、​​WARNING​​​、​​ERROR​​等,还可以设置日志的格式和输出位置,比如把日志输出到文件中,方便后续查看和分析。

59. NumPy数组和Pandas DataFrame的区别是什么?

NumPy数组和Pandas DataFrame各有优缺点。NumPy数组更适合处理纯数值数据,它的性能很高,运算速度很快,而且有很多高效的数学函数。但NumPy数组没有标签,操作起来不太直观。

Pandas DataFrame更适合处理结构化的表格数据,它有行名和列名,操作起来很方便,比如可以用列名直接访问数据,还可以很方便地进行数据清洗、筛选、分组等操作。但Pandas DataFrame的性能比NumPy数组稍差一些,因为它多了很多额外的功能和数据结构。

60. 怎么在Python中创建自定义异常类?

创建自定义异常类很简单,只需要继承​​Exception​​类就行。比如:

class CustomError(Exception):
    pass

这样就创建了一个自定义异常类​​CustomError​​​,你可以在代码中用​​raise CustomError("Something went wrong")​​来抛出这个异常,这样就能让错误信息更具体,方便调试和处理。

结语

掌握Python对于任何数据分析师来说都是必备的技能。Python不仅可以用来处理数据、可视化,还能用来做统计建模和自动化任务。面试的时候,面试官不仅会考察你的代码能力,还会看你能不能把Python的概念应用到实际的数据问题中。

这60道题目可以帮助你打下坚实的Python基础,让你在面试中更有信心。在练习这些题目的时候,不要只关注代码的正确性,还要学会清楚地解释你的思路。很多雇主更看重你的清晰表达、问题解决策略以及沟通能力,而不仅仅是技术准确性。所以,一定要练习清楚、自信地回答问题,祝你在面试中一切顺利!

如果你觉得这篇文章对你有帮助,别忘了点赞和分享哦!也欢迎留言交流更多Python和数据分析的经验和技巧,一起进步!


本文转载自Halo咯咯    作者:基咯咯

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2025-7-24 09:04:46修改
收藏
回复
举报
回复
相关推荐