导入和导出
文章目录
该文章内容为《Pandas数据分析实战》的学习笔记
读入和写入JSON文件
JSON由键值对组成,其中键用作值的唯一标识符。通过冒号将键与值进行分隔。其中键必须为字符串,值可以是任意类型
{
"name" : "Harry Potter",
"age" : 17,
"wizard" : true,
"friends" : ["Ron Weasley", "Hermione Granger"]
}
还可以进行嵌套
{
"name" : "Harry Potter",
"age" : 17,
"wizard" : true,
"friends" : ["Ron Weasley", "Hermione Granger"],
"address" : {
"street" : "4 Privet Drive",
"town" : "Little Whinging"
}
}
将JSON文件加载到DataFrame中
nobel = pd.read_json("pandas-in-action-master/chapter_12_imports_and_exports/nobel.json")
nobel.head()
Pandas会将顶级prizes键设置为列名,然后从JSON中解析每个键值对创建一个Python字典
nobel.loc[2, "prizes"]
type(nobel.loc[2, "prizes"])
现在我们想要将其转换为表格格式,我们需要提取JSON的顶级键值对year和category来形成DataFrame列,然后遍历laureates列表中的每一个字典来提取嵌套信息。最终为每一个诺贝尔奖获得者设置一个单独的行。我们可以使用json_normalize
函数来解决。其中record_path参数可以接受一个字符串,表示字典中的哪个键保存嵌套信息。用record_path参数同时会导致顶级键值对的消失,我们使用meta参数,向其传入一个列表
chemistry_2019 = nobel.loc[0, "prizes"]
pd.json_normalize(
data = chemistry_2019,
record_path="laureates",
meta = ["year", "category"]
)
这时我们通过用同样的方法应用于整个数据,它会报错,因为Series中某些字典没有laureates键,我们可以使用setdefault
方法为laureates键提供一个空列表的值。
def add_laureates_key(entry):
entry.setdefault("laureates", [])
nobel["prizes"].apply(add_laureates_key)
winners = pd.json_normalize(
data = nobel["prizes"],
record_path="laureates",
meta = ["year", "category"]
)
winners
将DataFrame导出到JSON文件
我们可以使用to_json
方法将DataFrame导出到JSON文件中。我们可以通过orient参数来设置JSON的格式。默认情况下,orient参数的值为"columns",它会将DataFrame的列名作为JSON的键。
通过orient参数设置为"records",它会将DataFrame的每一行作为一个字典,行索引作为键,列名作为值。我们可以使用lines
参数来设置是否将JSON文件分成多行。默认情况下,lines参数的值为False,它会将整个DataFrame导出为一个JSON对象。如果将lines参数设置为True,它会将每一行导出为一个JSON对象。
winners.head(2).to_json(orient="records")
也可以将orient参数设置为split,从而返回一个具有单独列、索引和数据键的字典。这种方法可以防止每个条目的列名重复。
winners.head(2).to_json(orient="split")
读取和写入CSV文件
我们还可以通过将URL作为参数传递给read_csv
函数来读取CSV文件
url = "https://data.cityofnewyork.us/api/views/25th-nujf/rows.csv"
baby_names = pd.read_csv(url)
baby_names.head()
我们可以使用to_csv
方法将DataFrame导出到CSV文件中。我们可以通过index参数来设置是否将行索引导出到CSV文件中。默认情况下,index参数的值为True,它会将行索引导出到CSV文件中。如果将index参数设置为False,它会将行索引不导出到CSV文件中。
baby_names.head(10).to_csv()
baby_names.head(10).to_csv(index=False)
我们可以将所需的文件名作为第一个参数传递给to_csv
方法。
baby_names.head(10).to_csv("NYC_baby_names.csv", index=False)
现在你就会看到在你的工作目录下多出了一个csv文件
在默认情况下,Pandas会将所有的列写入CSV文件,我们可以通过columns参数来选择要导出的列
baby_names.to_csv(
"NYC_baby_names.csv",
index = False,
columns=["Gender", "Child's First Name", "Count"]
)
读取和写入Excel工作簿
Pandas需要使用xlrd和openpyxl库来与Excel交互。首先我们要先安装它们。
pip install xlrd openpyxl
导入Excel工作簿
在安装好了上面那些包之后,我们就可以导入Excel文件了
pd.read_excel("./pandas-in-action-master/chapter_12_imports_and_exports/Single Worksheet.xlsx")
read_excel
函数的许多参数与read_csv
函数的参数相同。
pd.read_excel(
io = "./pandas-in-action-master/chapter_12_imports_and_exports/Single Worksheet.xlsx",
usecols = ["City", "First Name", "Last Name"],
index_col = "City"
)
当一个工作簿包含多个工作表时,在默认情况下,Pandas仅导入第一个工作表
pd.read_excel("./pandas-in-action-master/chapter_12_imports_and_exports/Multiple Worksheets.xlsx")
我们可以通过将工作表的索引位置或其名称传递给sheet_name参数来导入特定的工作表。参数的默认值为0
pd.read_excel(
io = "./pandas-in-action-master/chapter_12_imports_and_exports/Multiple Worksheets.xlsx",sheet_name = 0
)
pd.read_excel(
io = "./pandas-in-action-master/chapter_12_imports_and_exports/Multiple Worksheets.xlsx",sheet_name = "Data 1"
)
若要导入所有工作表可以将sheet_name参数设置为None。read_excel
函数将返回一个字典,其中键是工作表的名称,值是DataFrame
workbook = pd.read_excel(
io = "./pandas-in-action-master/chapter_12_imports_and_exports/Multiple Worksheets.xlsx",
sheet_name = None
)
workbook
导出Excel工作簿
girls = baby_names[baby_names["Gender"] == "FEMALE"]
boys = baby_names[baby_names["Gender"] =="MALE"]
首先要创建一个WxcelWriter对象,然后再用to_excel
方法将DataFrame导出到Excel工作簿中
excel_file = pd.ExcelWriter("baby_names.xlsx")
girls.to_excel(excel_writer=excel_file, sheet_name = "girls", index = False)
boys.to_excel(excel_file, sheet_name = "Boys", index = False, columns = ["Child's First Name", "Count", "Rank"])
最后必须要使用ExcelWriter对象的close
方法来保存工作簿
excel_file.close()
代码挑战
tv_shows_json = pd.read_json("./pandas-in-action-master/chapter_12_imports_and_exports/tv_shows.json")
tv_shows_json
本章的问题如下:
(1) 对 show
列中每个字典的嵌套剧集数据进行规范化。目标是生成一个DataFrame,每行表示一个单独剧集的数据。每行应包括剧集的相关元数据(season
、episode
、name
和 air_date
),以及电视剧的顶级信息(show
、runtime
和 network
)。
(2) 将规范化之后的数据集拆分到3个独立的DataFrame中,每部电视剧对应一个DataFrame。
(3) 将3个DataFrame写入episodes.xlsx
Excel工作簿,并将每部电视剧的剧集数据保存到单独的工作表中(工作表名称可自行决定)。
解决方案
# 1
tv_shows = pd.json_normalize(
data = tv_shows_json["shows"],
record_path = "episodes",
meta = ["show", "runtime", "network"]
)
tv_shows
# 2
xfiles = tv_shows[tv_shows["show"] == "The X-Files"]
lost = tv_shows[tv_shows["show"] == "Lost"]
buffy = tv_shows[tv_shows["show"] == "Buffy the Vampire Slayer"]
# 3
episodes = pd.ExcelWriter("episodes.xlsx")
xfiles.to_excel(episodes, sheet_name = "The X-Files", index = False)
lost.to_excel(episodes, sheet_name = "Lost", index = False)
buffy.to_excel(episodes, sheet_name = "Buffy the Vampire Slayer", index = False)
episodes.close()
关注公众号小辛到处学,发送1,获取文中的数据资源