个人简介:机电专业在读研究生,CSDN内容合伙人,博主个人首页
Python面试专栏:《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读,一起进步!
码字不易,如果觉得文章不错或能帮助到你学习,可以点赞收藏评论+关注哦!
本文是Python面试专栏的第五篇。在本专栏中,我将总结华为、阿里巴巴、字节跳动等互联网公司 Python 面试中最常见的 100+ 问题。每道题都提供参考答案,希望能够帮助你在求职面试中脱颖而出,找到一份高薪工作。这些面试题涉及 Python 基础知识、Python 编程、数据分析以及 Python 函数库等多个方面。
Pandas 是一个开源的 Python 数据分析库,它提供了丰富的数据操作和处理功能,包括数据的读取与写入、切片与索引、过滤和排序、缺失值的处理、聚合和统计分析等。同时,Pandas 还集成了 NumPy 库,使得它能够更好地处理大规模的数值计算和数组操作。Pandas 的核心数据结构是 DataFrame,它可以存储和处理具有不同类型的二维标签化数据。
通过 Pandas,我们可以方便地进行数据清洗、转换和分析,对数据进行探索性分析和可视化,并与其他数据科学工具和库协同使用,如 Matplotlib、Scikit-Learn 等。
序列(Series)和数据框(DataFrame)是 Pandas 库中两个重要的数据结构。
序列(Series) 是 Pandas 库中的一维标记数组,类似于带有标签的一维数组。它由两部分组成:索引(Index)和值(Value)。索引提供了对数据的标签,可以用于访问和操作数据。值是存储在序列中的实际数据。序列中的数据类型可以是数字、字符串、布尔值等。
数据框(DataFrame) 是 Pandas 库中的二维表格型数据结构,类似于电子表格或 SQL 中的表。它由行索引和列索引组成,每列可以包含不同类型的数据。数据框可以看作是多个序列按照同样的索引组合而成的。数据框常用于处理和分析结构化的数据。
要创建一个 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 文件读取
可以使用以下方法组合 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 进行连接
要从字典创建一个 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’ 来创建序列。
在处理 DataFrame 中的缺失值时,可以采取以下步骤来识别和处理它们:
识别缺失值:使用 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)
fillna()
函数可以将缺失值替换为指定的数值。# 将缺失值替换为 0
df_fillna = df.fillna(0)
print(df_fillna)
# 将缺失值替换为每列的平均值
df_fillna_mean = df.fillna(df.mean())
print(df_fillna_mean)
另外,fillna()
函数还可以使用其他填充方法,例如前向填充(ffill
)或后向填充(bfill
)。
在 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)
可以使用 +
运算符、直接赋值或者 insert()
将新列添加到 Pandas 数据帧,如下所示:
import pandas as pd
# 创建一个示例 DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
# 创建新的 Series
df['third']= = pd.Series([7, 8, 9])
#To add new column third
df += new_column
print (df)
# 创建新的 Series
new_column = pd.Series([10, 11, 12])
# 分配新列到 DataFrame
df['D'] = new_column
print(df)
# 定义新列的名称和数据
new_column_name = 'E'
new_column_data = [13, 14, 15]
# 在指定位置插入新列
df.insert(loc=1, column=new_column_name, value=new_column_data)
print(df)
del df.index._name
或者将索引幅值为 None
以按名称删除索引。import pandas as pd
# 创建一个示例 DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
# 设置索引名称为 'Index_Name'
df.index.name = 'Index_Name'
print(df)
# 删除索引名称
del df.index._name # 等效于 df.index._name = None
print(df)
'''
输出:
A B
Index_Name
0 1 4
1 2 5
2 3 6
A B
0 1 4
1 2 5
2 3 6
'''
注意:如果在
del df.index._name
之前没有设置索引的名称,那么将提示AttributeError
错误,因为它只会删除已经存在的索引名称。
drop()
方法用于从 DataFrame 中删除行/列。axis=0
表示删除指定行或多行,axis=1
表示删除指定列或多列。import pandas as pd
# 创建一个示例 DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
# 删除指定行
df_without_rows = df.drop([0, 2])
print(df_without_rows)
# 创建一个示例 DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
# 删除指定列
df_without_columns = df.drop(['A'], axis=1)
print(df_without_columns)
要获取 Series A
中没有的 Series B
中的项,可以使用 Pandas 的 isin()
方法和布尔索引。
以下是一种常见的方法:
import pandas as pd
# 创建示例 Series
series_a = pd.Series([1, 2, 3, 4])
series_b = pd.Series([3, 4, 5, 6])
# 使用 isin() 方法检查 Series B 中的项是否在 Series A 中
is_in_series_a = series_b.isin(series_a)
# 使用布尔索引获取 Series B 中不在 Series A 中的项
result = series_b[~is_in_series_a]
print(result)
输出结果如下所示,即为 Series A
中没有的 Series B
中的项:
2 5
3 6
dtype: int64
注意:以上代码假设 Series
A
和 SeriesB
的数据类型相同(都为整数)。如果 SeriesA
和 SeriesB
的数据类型不同,需要先将它们转为相同的数据类型。
要获取序列 A 和序列 B 的非公共项,可以使用 Pandas 的 isin() 方法和布尔索引的结合。
以下是一种常见的方法:
import pandas as pd
# 创建示例 Series
series_a = pd.Series([1, 2, 3, 4])
series_b = pd.Series([3, 4, 5, 6])
# 使用 isin() 方法检查 Series A 和 Series B 中的元素是否相互存在
is_in_series_a = series_b.isin(series_a)
is_in_series_b = series_a.isin(series_b)
# 使用布尔索引获取各自序列中不在另一个序列中的项
result = series_a[~is_in_series_b]._append(series_b[~is_in_series_a])
print(result)
输出结果如下所示,即为序列 A 和序列 B 的非公共项:
0 1
1 2
2 5
3 6
dtype: int64
是的,Pandas 库可以识别和处理日期和时间数据。当从不同来源导入数据时,Pandas 提供了多种方法来解析和识别日期和时间。
使用 pd.to_datetime()
函数:可以使用 pd.to_datetime()
函数将字符串转换为 Pandas 的日期时间对象。它可以自动解析多种日期和时间格式,并将其转换为标准的日期时间格式。
import pandas as pd
# 示例数据
data = ['2022-01-01 12:00:00', '2022-01-02 13:30:45', '2022-01-03 15:15:00']
# 转换为日期时间对象
datetime_data = pd.to_datetime(data)
print(datetime_data)
输出结果如下所示:
DatetimeIndex(['2022-01-01 12:00:00', '2022-01-02 13:30:45', '2022-01-03 15:15:00'], dtype='datetime64[ns]', freq=None)
在这个例子中,pd.to_datetime()
函数将日期时间字符串列表转换为 Pandas 的 DatetimeIndex
对象,这是一个包含日期和时间的索引。
dateutil.parser.parse()
:在某些情况下,日期和时间可能具有非标准的格式,无法被自动解析。可以使 dateutil.parser.parse()
函数来解析这些字符串。它是 dateutil 库中的一个功能强大的日期时间解析器。
from dateutil.parser import parse
import pandas as pd
# 示例数据
data = ['01/01/2022 12pm', '01/02/2022 01:30pm', '01/03/2022 03:45pm']
# 解析日期时间字符串
datetime_data = [parse(dt) for dt in data]
# 转换为 pandas 的日期时间对象
datetime_data = pd.to_datetime(datetime_data)
print(datetime_data)
输出结果如下所示:
DatetimeIndex(['2022-01-01 12:00:00', '2022-01-02 13:30:00', '2022-01-03 15:45:00'], dtype='datetime64[ns]', freq=None)