Pandas学习笔记(十)

导入和导出

该文章内容为《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,每行表示一个单独剧集的数据。每行应包括剧集的相关元数据(seasonepisodenameair_date),以及电视剧的顶级信息(showruntimenetwork)。

(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,获取文中的数据资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值