华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(五)(1)

简介: 华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(五)(1)

本文是Python面试专栏的第五篇。在本专栏中,我将总结华为、阿里巴巴、字节跳动等互联网公司 Python 面试中最常见的 100+ 问题。每道题都提供参考答案,希望能够帮助你在求职面试中脱颖而出,找到一份高薪工作。这些面试题涉及 Python 基础知识、Python 编程、数据分析以及 Python 函数库等多个方面。

Python Pandas 面试问题

60. 什么是 Pandas?


Pandas 是一个开源的 Python 数据分析库,它提供了丰富的数据操作和处理功能,包括数据的读取与写入、切片与索引、过滤和排序、缺失值的处理、聚合和统计分析等。同时,Pandas 还集成了 NumPy 库,使得它能够更好地处理大规模的数值计算和数组操作。Pandas 的核心数据结构是 DataFrame,它可以存储和处理具有不同类型的二维标签化数据。

通过 Pandas,我们可以方便地进行数据清洗、转换和分析,对数据进行探索性分析和可视化,并与其他数据科学工具和库协同使用,如 Matplotlib、Scikit-Learn 等。


61. 什么是序列和数据框?


序列(Series)和数据框(DataFrame)是 Pandas 库中两个重要的数据结构。

  • 序列(Series) 是 Pandas 库中的一维标记数组,类似于带有标签的一维数组。它由两部分组成:索引(Index)和值(Value)。索引提供了对数据的标签,可以用于访问和操作数据。值是存储在序列中的实际数据。序列中的数据类型可以是数字、字符串、布尔值等。
  • 数据框(DataFrame) 是 Pandas 库中的二维表格型数据结构,类似于电子表格或 SQL 中的表。它由行索引和列索引组成,每列可以包含不同类型的数据。数据框可以看作是多个序列按照同样的索引组合而成的。数据框常用于处理和分析结构化的数据。


62. 如何创建一个 DataFrame?


要创建一个 DataFrame,可以使用 Pandas 的 DataFrame() 构造函数,并传入相应的数据和参数或者从 CSV,Excel,Json 等文件中读取。

import pandas as pd
data = [['Alice', 25], ['Bob', 30], ['Charlie', 35]]
df1 = pd.DataFrame(data, columns=['Name', 'Age'])   # 从列表创建
data = {'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35]}
df2 = pd.DataFrame(data)    # 从字典创建
df3 = pd.read_csv('data.csv') # 从 CSV 文件读取
df4 = pd.read_excel('data.xlsx', sheet_name='Sheet1')   # 从 Excel 文件读取
df5 = pd.read_json('data.json')   # 从 Json 文件读取

63. 如何组合不同的 Pandas DataFrame?

可以使用以下方法组合 DataFrame:

  • _append() 方法:将一个 DataFrame 追加到另一个 DataFrame 的末尾。
  • concat() 方法: 沿着指定的轴(默认沿行)连接多个 DataFrame。
  • join() 方法: 基于索引或列的值进行连接,也可以使用 merge() 实现相同的功能。
  • merge() 方法:基于共同的列或索引值进行连接,并可以指定不同类型的连接。
import pandas as pd
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
combined_df1 = df1._append(df2)   # 创建一个新的 DataFrame,其中包含 df1 和 df2 的行
combined_df2 = pd.concat([df1, df2], axis=0) # axis=0 表示沿着行方向组合
combined_df3 = pd.concat([df1, df2], axis=1) # axis=1 表示沿着列方向组合
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]}, index=['a', 'b'])
df2 = pd.DataFrame({'C': [5, 6], 'D': [7, 8]}, index=['b', 'c'])
combined_df4 = df1.join(df2)    # 通过索引将 df1 和 df2 进行连接
df1 = pd.DataFrame({'ID': [1, 2], 'Name': ['Alice', 'Bob']})
df2 = pd.DataFrame({'ID': [2, 3], 'Age': [25, 30]})
combined_df5 = pd.merge(df1, df2, on='ID')    # 通过 'ID' 列将 df1 和 df2 进行连接

64. 如何由字典创建一个 Pandas 序列?


要从字典创建一个 Pandas 序列,可以使用 pd.Series() 构造函数,并传入字典作为参数,将创建一个包含字典中数据的序列,索引由字典的键自动生成。如下:

import pandas as pd
data = {'a': 1, 'b': 2, 'c': 3}
series = pd.Series(data)
print(series)
'''
输出:
a    1
b    2
c    3
dtype: int64
'''

上述示例中,字典的键 ‘a’、‘b’、‘c’ 成为序列的索引,对应的值 1、2、3 成为序列的数据。其中 dtype: int64 表示数据类型为整数。

除了字典,还可以使用列表、元组等来创建 Pandas 序列。在创建序列时,可以通过指定索引来自定义序列的标签,或使用默认的整数索引。

import pandas as pd
data = [10, 20, 30]
index = ['a', 'b', 'c']
series = pd.Series(data, index=index)
print(series)
'''
输出:
a    10
b    20
c    30
dtype: int64
'''

上述示例中,使用了自定义的索引 ‘a’、‘b’、‘c’ 来创建序列。


65. 如何识别和处理 DataFrame 中的缺失值?

在处理 DataFrame 中的缺失值时,可以采取以下步骤来识别和处理它们:

  1. 识别缺失值:使用 Pandas 库中的 isna()isnull() 函数可以对 DataFrame 进行逐个元素的遍历,并返回一个布尔类型的 DataFrame,其中的 True 表示该位置存在缺失值。
import pandas as pd
# 创建一个包含缺失值的 DataFrame
df = pd.DataFrame({'A': [1, 2, None, 4],
                 'B': [5, None, 7, 8],
                 'C': [9, 10, 11, None]})
# 判断每个元素是否为缺失值
is_missing = df.isnull()
print(is_missing)
'''
输出:
       A      B      C
0  False  False  False
1  False   True  False
2   True  False  False
3  False  False   True
'''

处理缺失值:根据具体情况,可以选择以下几种方式来处理缺失值:

  • 删除缺失值:使用 dropna() 函数可以删除包含缺失值的行或列。
# 删除包含缺失值的行
df_dropna = df.dropna()
print(df_dropna)
# 删除包含缺失值的列
df_dropna_columns = df.dropna(axis=1)
print(df_dropna_columns)
# 将缺失值替换为 0
df_fillna = df.fillna(0)
print(df_fillna)
# 将缺失值替换为每列的平均值
df_fillna_mean = df.fillna(df.mean())
print(df_fillna_mean)

另外,fillna() 函数还可以使用其他填充方法,例如前向填充(ffill)或后向填充(bfill)。


66. 如何理解 Pandas 的重新索引?


在 Pandas 中,重新索引是指对数据结构(如 Series 或 DataFrame)的行索引或列索引进行修改、重新排序或扩充的操作。通过重新索引,可以改变数据的顺序、增加或删除索引标签,使得数据结构与新的索引对齐。

Pandas 提供了 reindex() 方法来执行重新索引操作。有以下常见的用法:

  • 更改现有索引的顺序:传入一个新的索引顺序,将数据按照新的索引顺序重新排序。
  • 增加缺失值或填充值:根据新的索引增加缺失值,或者使用指定的填充值填充缺失位置。
  • 修改行索引或列索引:修改行索引或列索引。

示例代码如下:

import pandas as pd
# 创建一个示例 Series
s = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
# 重新索引,按照新的索引顺序排序
s_reindexed = s.reindex(['c', 'b', 'a'])
print(s_reindexed)
# 重新索引,增加缺失值
s_reindexed = s.reindex(['a', 'b', 'c', 'd'])
print(s_reindexed)
# 重新索引,填充缺失位置为 0
s_filled = s.reindex(['a', 'b', 'c', 'd'], fill_value=0)
print(s_filled)
# 创建一个示例 DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['a', 'b', 'c'])
# 修改行索引
df_reindexed_rows = df.reindex(['c', 'b', 'a'])
print(df_reindexed_rows)
# 修改列索引
df_reindexed_columns = df.reindex(columns=['B', 'A'])
print(df_reindexed_columns)
相关文章
|
2月前
|
数据采集 机器学习/深度学习 数据可视化
了解数据科学面试中的Python数据分析重点,包括Pandas(DataFrame)、NumPy(ndarray)和Matplotlib(图表绘制)。
【7月更文挑战第5天】了解数据科学面试中的Python数据分析重点,包括Pandas(DataFrame)、NumPy(ndarray)和Matplotlib(图表绘制)。数据预处理涉及缺失值(dropna(), fillna())和异常值处理。使用describe()进行统计分析,通过Matplotlib和Seaborn绘图。回归和分类分析用到Scikit-learn,如LinearRegression和RandomForestClassifier。
60 3
|
2月前
|
Python
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
|
2月前
|
存储 算法 索引
1124. 表现良好的最长时间段 (python) 前缀和 分类讨论 最大长度 力扣 面试题
1124. 表现良好的最长时间段 (python) 前缀和 分类讨论 最大长度 力扣 面试题
|
2月前
|
算法 Java Linux
python中的面试常考知识点
python中的面试常考知识点
|
4月前
|
存储 数据可视化 算法
最新Python-Matplotlib可视化(9)——精通更多实用图形的绘制,2024年最新小米面试题库
最新Python-Matplotlib可视化(9)——精通更多实用图形的绘制,2024年最新小米面试题库
最新Python-Matplotlib可视化(9)——精通更多实用图形的绘制,2024年最新小米面试题库
|
4月前
|
SQL 分布式计算 前端开发
10个常见的python面试问题_python面试常见问题
10个常见的python面试问题_python面试常见问题
|
22天前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
23天前
|
Java C++
【Java基础面试十七】、Java为什么是单继承,为什么不能多继承?
这篇文章讨论了Java单继承的设计原因,指出Java不支持多继承主要是为了避免方法名冲突等混淆问题,尽管Java类不能直接继承多个父类,但可以通过接口和继承链实现类似多继承的效果。
【Java基础面试十七】、Java为什么是单继承,为什么不能多继承?
|
22天前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。
|
22天前
|
Java
【Java基础面试三十七】、说一说Java的异常机制
这篇文章介绍了Java异常机制的三个主要方面:异常处理(使用try、catch、finally语句)、抛出异常(使用throw和throws关键字)、以及异常跟踪栈(异常传播和程序终止时的栈信息输出)。