大家好,第三方库是为了满足某种需求而被创建和开发的。开发者意识到一个问题,并想出了一个解决方案来帮助解决它,这就是工具的产生方式。
毫无疑问,Pandas拥有一个高度活跃的社区,使其成为数据科学生态系统中最受欢迎的数据分析和清洗库之一。Pandas具有解决特定问题和使用案例的功能,这些功能必然是社区中活跃使用者提出的需求。
本文我们将与大家分享4个可以使用一行代码在Pandas中完成的操作,这些操作可以帮助大家高效地解决特定任务。
假设有一个项目列表,想要查看它们的分布情况。更具体地说,是想查看列表中的唯一值及其出现次数。
Python字典是以这种格式存储数据的好方法,项目将是字典的键,出现次数将是值。借助value_counts
和to_dict
函数,这个任务可以在一行代码中完成。
以下是一个简单的示例来演示这种情况:
import pandas as pd
grades = ["A", "A", "B", "B", "A", "C", "A", "B", "C", "A"]
pd.Series(grades).value_counts().to_dict()
# 输出
{'A': 5, 'B': 3, 'C': 2}
首先将列表转换为Pandas Series,这是Pandas的一维数据结构。然后应用value_counts
函数,在Series中获取唯一值及其在系列中的频率,最后将输出转换为字典。
JSON是一种经常用于存储和传递数据的文件格式,当从API请求数据时,很可能是以JSON格式传递的。
在清洗、处理或分析数据时,通常更希望它以表格格式(即类似于表格的数据结构)存在。可以借助json_normalize
函数,通过一次操作将JSON格式的对象创建为Pandas DataFrame。
假设数据存储在名为data.json
的JSON文件中,按以下方式读取它:
import json
with open("data.json") as f:
data = json.load(f)
data
# 输出
{'data': [{'id': 101,
'category': {'level_1': 'code design', 'level_2': 'method design'},
'priority': 9},
{'id': 102,
'category': {'level_1': 'error handling', 'level_2': 'exception logging'},
'priority': 8}]}
如果将这个变量传递给DataFrame构造函数,它将创建一个如下所示的DataFrame,这显然不是一个可用的格式:
df = pd.DataFrame(data)
如果使用json_normalize
函数并提供记录路径,将会得到一个格式整洁、清晰的DataFrame:
df = pd.json_normalize(data, "data")
考虑这样一种情况:有一个与特定记录相匹配的项目列表,需要重新格式化该列表,使得列表中的每个项目都有单独的一行。
下面的图示说明了需要完成的内容:
可以想出许多不同的方法来解决这个任务,其中最简单的之一(也可能是最简单的)就是explode
函数。现在有以下DataFrame:
我们将使用explode
函数并指定要拆分的列名:
df_new = df.explode(column="data").reset_index(drop=True)
reset_index
会为生成的DataFrame分配一个新的整数索引,否则拆分之前的索引将被保留(即所有键值为A的行的索引都会是0)。
combine_first
函数用于特定目的,但它极大地简化了该项特定任务。以下是希望使用combine_first
函数的特定情况:
你想从DataFrame中提取一列。如果该列中有缺失值,则希望用另一列中的值替换这些缺失值。
在这方面它与SQL中的COALESCE
函数执行相同的操作,接下来创建一个带有一些缺失值的示例DataFrame:
df = pd.DataFrame(
{
"A": [None, 0, 12, 5, None],
"B": [3, 4, 1, None, 11]
}
)
我们需要列A中的数据,如果有一行有缺失值(即NaN),希望用同一行中列B的值来填充它。
df["A"].combine_first(df["B"])
# 输出
0 3.0
1 0.0
2 12.0
3 5.0
4 11.0
Name: A, dtype: float64
从输出中可以看出,列A的第一行和最后一行来自列B。
如果有3列需要使用,可以链接多个combine_first
函数。以下一行代码首先检查列A,如果有缺失值,它会从列B中获取。如果列B中对应的行也是NaN,那么它会从列C中获取值。
df["A"].combine_first(df["B"]).combine_first(df["C"])
我们还可以在DataFrame级别上使用combine_first
函数,在这种情况下,所有缺失值都将由第二个DataFrame中对应的值(即相同行,相同列)来填充。