Pandas学习笔记(四)

发布于:2025-05-12 ⋅ 阅读:(15) ⋅ 点赞:(0)

DataFrame对象

DataFrame是具有行和列的二维数据表,相比于Series,DataFrame可以有很多列。并且DataFrame很多操作与Series相似

导入本文需要的包

import pandas as pd
import numpy as np

通过字典创建DataFrame

city_data = {
    "City": ["New York City", "Paris", "Barcelona", "Rome"],
    "Country": ["United States", "France", "Spain", "Italy"],
    "Population": [8600000, 2141000, 5515000, 2873000]
}
cities = pd.DataFrame(city_data)
cities

DataFrame与Series的相似之处

使用read_csv函数导入DataFrame
nba = pd.read_csv("./pandas-in-action-master/chapter_04_the_dataframe_object/nba.csv",
                  parse_dates=["Birthday"])
nba
Series和DataFrame的共享与专有属性

Series只有一列,所以其只有一个dtype属性。而DataFrame有很多

pd.Series([1, 2, 3]).dtype
nba.dtypes

注意Series是dtype,DataFrame是dtypes

查看列名:

nba.columns

查看维度:

nba.shape

计算数值总数:

nba.size

这样得到的事包含缺失值的数量,如果想要查看排出缺失值的总数,可以用下面这种方法

nba.count().sum()
Series和DataFrame的共有方法
nba.head(2)
nba.tail(n = 3)
nba.sample(3)
nba.max()
nba.min()
nba.nlargest(n = 4, columns = "Salary")
# 只对数字字段加和
nba.sum(numeric_only = True)
nba.mean(numeric_only = True)
nba.median(numeric_only = True)
nba.mode(numeric_only = True)
nba.std(numeric_only = True)

对DataFrame进行排序

按照单列进行排序
nba.sort_values("Name")
nba.sort_values(by = "Name")
nba.sort_values(by = "Name", ascending = False) # 降序
按照多列进行排序
nba.sort_values(by = ["Team", "Name"])
# 还可以指定每一列是升序还是降序
nba.sort_values(by = ["Team", "Name"], ascending = [True, False])
按照索引进行排序
# 在存储排序之后,我们还可以通过对索引排序来恢复
nba = nba.sort_values(by = ["Team", "Name"], ascending = [True, False])
nba
nba = nba.sort_index()
nba
对列索引进行排序
nba.sort_index(axis = "columns")
nba.sort_index(axis = 1)

设置索引

nba.set_index(keys = "Name")
nba.set_index("Name")
nba = nba.set_index("Name") # 覆盖

上面两种是相同的

从DataFrame中选择列

从DataFrame中选择单列
nba.Salary

这种方式返回的是对应的Series

还可以:

nba[("Salary")]

这种方法的优点是支持带空格的列名,如果列名带空格只能通过方括号来提取

从DataFrame中选择多列
nba[["Salary", 'Birthday']]

中括号里的顺序变了,输出的顺序也会变

nba[['Birthday', 'Salary']]

可以使用select_dtypes方法,根据数据类型选择列。该方法接受两个参数includeexclude。参数接收单个字符串或列表,表示Pandas应保留或丢弃的列类型。

nba.select_dtypes(include = "object")
nba.select_dtypes(exclude = ["object", "int"])

从DataFrame中选择行

使用索引标签提取行
nba.loc["LeBron James"]
nba.loc[["LeBron James", "Paul George"]]

同样的索引时的顺序,代表输出的顺序

还支持Python的列表切片语法

nba.sort_index().loc["Otto Porter" : "Patrick Beverley"]
nba.sort_index().loc["Zach Collins":]
nba.sort_index().loc[:"Al Horford"]

loc切片包括上限的值,但列表切片不包括上限的值

按索引位置提取行
nba.iloc[300]
nba.iloc[[100, 200, 300, 400]]
nba.iloc[400:404]
nba.iloc[:2]
nba.iloc[447:]
从特征列中提取特征值
nba.loc["Giannis Antetokounmpo", "Team"]
nba.loc["James Harden", ["Position", "Birthday"]]
nba.loc[["Russell Westbrook", "Anthony Davis"], ["Team", "Position"]]
nba.loc["Joel Embiid", "Position" : "Salary"]
nba.iloc[57, 3]

使用lociloc的时因为Pandas要先确定传入的数据类型,所以运行速度较慢。如果只需要提取单个值的时候,可以用at代替loc,用iat代替iloc,使代码的运行速度更快。其中at系列和loc系列的使用方法类似。同时at系列也可以用于Series

对行或列进行重命名

查看列名:

nba.columns

可以通过为该属性分配新名称来重命名DataFrame的任何或所有列

nba.columns = ["Team", "position", "Date of Birth", "Pay"]

还可以通过rename传入一个字典实现,其中字典的值是新的名称

nba = nba.rename(columns = {"Date of Birth": "Birthday"})

将上面代码中的columns换位index就为更改索引名称

重置索引

现在我想要将Team作为新的索引,但我直接通过set_index更改会导致Name列数据的丢失

nba.set_index("Team").head()

我们可以通过reset_index之前的索引替换为数字索引,并且那一列会被保留,再更换索引

nba.reset_index().set_index("Team").head()

代码挑战

nfl.csv 文件包含美国国家橄榄球联盟中与 NBA 相似的数据结构,包括球员的 Name、Team、Position、Birthday 和 Salary 信息。尝试回答如下问题:

  1. 如何导入 nfl.csv 文件,并将其 Birthday 列中的值转换为日期时间类型?
  2. 可以通过哪两种方式设置 DataFrame 索引来存储球员姓名?
  3. 如何计算这个数据集中每支球队的球员人数?
  4. 收入最高的 5 名球员是谁?
  5. 如何先按球队名称升序对数据集进行排序,然后按薪资降序对数据集进行排序?
  6. New York Jets 队年龄最大的球员是谁,他的生日是哪天?
解决方案
# 1
nfl = pd.read_csv("./pandas-in-action-master/chapter_04_the_dataframe_object/nfl.csv", parse_dates=["Birthday"])

# 2
nfl = pd.read_csv("./pandas-in-action-master/chapter_04_the_dataframe_object/nfl.csv", parse_dates=["Birthday"], index_col = "Name")
nfl = pd.read_csv("./pandas-in-action-master/chapter_04_the_dataframe_object/nfl.csv", parse_dates=["Birthday"])
nfl = nfl.set_index("Name")

# 3
nfl.Team.value_counts()

# 4
nfl.sort_values(by = "Salary", ascending = False)

# 5
nfl.sort_values(by = ["Team", "Salary"], ascending = [True, False])

# 6
# 先将Team列设置为索引
nfl = nfl.reset_index().set_index("Team")
nfl.loc["New York Jets"].sort_values("Birthday").head(1)

网站公告

今日签到

点亮在社区的每一天
去签到