标签:False df 85% pd print 20 Pandas
目录
数据
小数数据
import openpyxl
import random
workbook = openpyxl.Workbook()
worksheet = workbook.create_sheet('小数数据')
worksheet.append(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'])
for row in range(2,12):
for col in range(1,11):
worksheet.cell(row, col, random.random())
workbook.save("测试数据.xlsx")
生成人名、年龄、性别、身份号码的CSV文件
from faker import Faker
import random
import openpyxl
workbook = openpyxl.open("测试数据.xlsx")
worksheet = workbook.create_sheet("人物")
workbook.save("测试数据.xlsx")
faker = Faker('zh_CN')
worksheet.append(["姓名", "年龄", "性别", "身份证号", '出生日期'])
for i in range(100):
nv = [
faker.name_female(),
str(random.randint(40, 60)),
"女",
faker.ssn(min_age=18, max_age=90),
faker.date(),
]
nan = [
faker.name_male(),
str(random.randint(40, 60)),
"男",
faker.ssn(min_age=18, max_age=90),
faker.date(),
]
worksheet.append(random.choice([nv, nan]))
workbook.save("测试数据.xlsx")
产品销售表
from faker import Faker
import random
import openpyxl
workbook = openpyxl.open("测试数据.xlsx")
worksheet = workbook.create_sheet('产品销售表')
worksheet.append(['销售员','产品','数量','单价','性别','城市'])
faker = Faker("zh_CN")
cp = ['鼠标','键盘','DVD','显示器','发电机','CPU']
xm = [faker.name_male() for _ in range(5)]
sl = [10,20,31,33]
xb = ['男','女']
cs = ['北京','哈尔滨','广州','深圳','杭州','沈阳']
for i in range(100):
data = [
xm[random.randint(0,len(xm)-1)],
cp[random.randint(0,len(cp)-1)],
str(sl[(random.randint(0,len(sl)-1))]),
str(random.randint(100,1000)),
xb[random.randint(0,len(xb)-1)],
cs[random.randint(0,len(cs)-1)]
]
worksheet.append(data)
workbook.save("测试数据.xlsx")
地区销售表
import random
from faker import Faker
import openpyxl
workbook = openpyxl.open("测试数据.xlsx")
worksheet = workbook.create_sheet("地区销售表")
cs = ['商品名称',"北京", "哈尔滨", "广州", "深圳", "杭州", "沈阳"]
cp = ["鼠标", "键盘", "DVD", "显示器", "发电机", "CPU"]
faker = Faker("zh_CN")
worksheet.append(cs)
for i in cp:
data = [i]+[str(random.randint(1, 100)) for i in range(len(cs) - 1)]
worksheet.append(data)
workbook.save("测试数据.xlsx")
from collections import deque
my_list = deque([2, 3, 4])
my_list.appendleft(1) # 在头部插入1
print(list(my_list)) # 输出: [1, 2, 3, 4]
[1, 2, 3, 4]
发货单表
import random
from faker import Faker
import openpyxl
workbook = openpyxl.open("测试数据.xlsx")
faker = Faker("zh_CN")
worksheet = workbook.create_sheet("发货单表")
worksheet.append(['客户名称','联系电话','快递地址'])
for c in range(100):
worksheet.append([faker.name(), faker.phone_number(), ' '.join([faker.province(),faker.city_name(),faker.street_address()])])
workbook.save("测试数据.xlsx")
学生表
from random import randint
from faker import Faker
faker = Faker("zh_CN")
import openpyxl
workbook = openpyxl.open("测试数据.xlsx")
cjb = workbook.create_sheet("成绩表")
tyb = workbook.create_sheet("体育表")
cjb.append("姓名,语文,数学,英语".split(","))
tyb.append("姓名,体育".split(","))
for i in range(10):
name = faker.name()
cjb.append([name,str(randint(0,100)),str(randint(0,100)),str(randint(0,100))])
tyb.append([name,str(randint(0,100))])
workbook.save("测试数据.xlsx")
相同的两张表
from random import randint
import openpyxl
title = list('ABCDEF')
workbook = openpyxl.open("测试数据.xlsx")
sheet1 = workbook.create_sheet("concat1")
sheet2 = workbook.create_sheet("concat2")
sheet1.append(title)
sheet2.append(title)
for _ in range(10):
sheet1.append([randint(0, 100) for i in range(6)])
sheet2.append([randint(0, 100) for i in range(6)])
workbook.save("测试数据.xlsx")
日期数据
from faker import Faker
import random
import time
faker = Faker("zh_CN")
title = ['姓名','年龄','性别','身份证号码','地址']
for i in range(10):
nv = [
faker.name_female(),
str(random.randint(40, 60)),
"女",
faker.ssn(min_age=18, max_age=90),
faker.address(),
]
nan = [
faker.name_male(),
str(random.randint(40, 60)),
"男",
faker.ssn(min_age=18, max_age=90),
faker.address(),
]
data = [nan,nv]
time.sleep(1)
数据结构
Pandas提供Series和DataFrame作为数组数据的存储框架,数据进入这两种框架后,我们就可以利用它们提供的强大处理方法进行处理。
名称 |
维度数据 |
描述 |
Series |
1 |
带标签的一维同质数组 |
DataFrame |
2 |
带标签的、大小可变的二维异构表格 |
文件中提供了关于Pandas库中两个核心数据结构的简要描述:
Series
索引 |
值 |
index1 |
1 |
index2 |
2 |
index3 |
3 |
... |
... |
DataFrame
- |
key1 |
key2 |
... |
index1 |
1 |
my |
... |
index2 |
2 |
name |
... |
index3 |
3 |
is |
... |
index4 |
4 |
tom |
... |
Series与DataFrame的区别
特性 |
Series |
DataFrame |
维度 |
一维 |
二维 |
数据类型 |
同质(所有元素类型相同) |
异质(可以包含不同类型的列) |
标签 |
索引标签 |
行索引和列索引 |
适用场景 |
适用于单一变量的时间序列数据 |
适用于表格数据,例如CSV文件 |
内存效率 |
高,因为只存储单一数据类型 |
相对较低,因为存储多种数据类型 |
操作 |
简单,如数值计算和统计分析 |
复杂,支持多列操作和数据透视表等 |
索引操作 |
直接通过索引标签访问数据 |
可以通过行索引和列索引访问数据 |
转换为另一种结构 |
可以通过增加索引列转换为DataFrame |
可以提取单一列作为Series使用 |
Series 对象
创建Series对象
class Series(base.IndexOpsMixin, NDFrame)
参数(Parameters)
-
data:
- 类型:array-like, Iterable, dict, 或 scalar value(类似数组的对象、可迭代对象、字典或标量值)
- 默认值:None
- 描述:存储在
Series
中的数据。如果为 None,则创建一个空的 Series
。
-
index:
- 类型:array-like or Index (1d)(类似数组的对象或一维索引)
- 默认值:None
- 描述:用于
Series
的索引。如果为 None,则默认为 RangeIndex
(例如 0, 1, 2, ..., n)。如果数据是字典类型,并且索引为 None,则使用数据中的键作为索引。
-
dtype:
- 类型:Dtype 或 None
- 默认值:None
- 描述:输出
Series
的数据类型。如果未指定,将从 data
推断。Dtype
可以是字符串、numpy 数据类型或扩展数据类型。
-
name:
- 类型:Hashable(可哈希的)
- 默认值:None
- 描述:赋予
Series
的名称。
-
copy:
- 类型:bool 或 None
- 默认值:None
- 描述:是否复制输入数据。如果为 None,则根据上下文自动决定是否复制。只影响
Series
或 1d ndarray 输入。
-
fastpath:
- 类型:bool 或 lib.NoDefault
- 默认值:lib.no_default
- 描述:这是一个内部参数,用于优化
pandas
的内部处理。通常,用户不需要设置这个参数。lib.NoDefault
是一个特殊的值,表示该参数没有默认值,并且应该在内部处理中特别考虑。
import pandas as pd
import numpy as np
# 1 使用列表创建:
data = pd.Series([1, 2, 3, 4, 5])
# 2 使用字典创建
data = pd.Series({"a": 1, "b": 2, "c": 3})
# 3 使用NumPy数组创建
data = pd.Series(np.array([1, 2, 3, 4, 5]))
# 4 使用标量值创建
data = pd.Series(5, index=["a", "b", "c", "d", "e"])
# 5 使用文件创建
data = pd.read_csv("series.csv")
# 6 使用函数创建
data = pd.Series(list(range(5)))
# 7 使用时间序列创建
data = pd.Series([1, 2, 3], index=pd.date_range("20240101", periods=3))
print(data)
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
Cell In[1], line 17
14 data = pd.Series(5, index=["a", "b", "c", "d", "e"])
16 # 5 使用文件创建
---> 17 data = pd.read_csv("series.csv")
19 # 6 使用函数创建
20 data = pd.Series(list(range(5)))
File c:\Users\newte\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\io\parsers\readers.py:1026, in read_csv(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)
1013 kwds_defaults = _refine_defaults_read(
1014 dialect,
1015 delimiter,
(...)
1022 dtype_backend=dtype_backend,
1023 )
1024 kwds.update(kwds_defaults)
-> 1026 return _read(filepath_or_buffer, kwds)
File c:\Users\newte\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\io\parsers\readers.py:620, in _read(filepath_or_buffer, kwds)
617 _validate_names(kwds.get("names", None))
619 # Create the parser.
--> 620 parser = TextFileReader(filepath_or_buffer, **kwds)
622 if chunksize or iterator:
623 return parser
File c:\Users\newte\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\io\parsers\readers.py:1620, in TextFileReader.__init__(self, f, engine, **kwds)
1617 self.options["has_index_names"] = kwds["has_index_names"]
1619 self.handles: IOHandles | None = None
-> 1620 self._engine = self._make_engine(f, self.engine)
File c:\Users\newte\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\io\parsers\readers.py:1880, in TextFileReader._make_engine(self, f, engine)
1878 if "b" not in mode:
1879 mode += "b"
-> 1880 self.handles = get_handle(
1881 f,
1882 mode,
1883 encoding=self.options.get("encoding", None),
1884 compression=self.options.get("compression", None),
1885 memory_map=self.options.get("memory_map", False),
1886 is_text=is_text,
1887 errors=self.options.get("encoding_errors", "strict"),
1888 storage_options=self.options.get("storage_options", None),
1889 )
1890 assert self.handles is not None
1891 f = self.handles.handle
File c:\Users\newte\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\io\common.py:873, in get_handle(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)
868 elif isinstance(handle, str):
869 # Check whether the filename is to be opened in binary mode.
870 # Binary mode does not support 'encoding' and 'newline'.
871 if ioargs.encoding and "b" not in ioargs.mode:
872 # Encoding
--> 873 handle = open(
874 handle,
875 ioargs.mode,
876 encoding=ioargs.encoding,
877 errors=errors,
878 newline="",
879 )
880 else:
881 # Binary mode
882 handle = open(handle, ioargs.mode)
FileNotFoundError: [Errno 2] No such file or directory: 'series.csv'
Series的索引
import pandas as pd
index = ['张三','李四','王五']
data = [-1,2,3]
s = pd.Series(data,index=index)
print(s)
print(type(s))
张三 -1
李四 2
王五 3
dtype: int64
<class 'pandas.core.series.Series'>
print('位置索引',s.iloc[0])
print("*" * 20)
print('标签索引',s['张三'])
print("*" * 20)
print("多标签索引", s[["张三","王五"]])
print("*" * 20)
print("切片索引", s[1:3])
print("*" * 20)
print("布尔索引", s[[True, False, True]])
print("*" * 20)
print("条件索引", s[s > 0])
print("*" * 20)
print("多条件索引", s[(s < 0) & (s < 2)])
print("*" * 20)
print("索引重命名", s.rename({"张三":"张三1"}))
print("*" * 20)
print('获取索引',s.index)
print("*" * 20)
print('获取标签',s.keys())
print("*" * 20)
print('获取值',s.values)
print("*" * 20)
print('获取数据类型',s.dtypes)
位置索引 -1
********************
标签索引 -1
********************
多标签索引 张三 -1
王五 3
dtype: int64
********************
切片索引 李四 2
王五 3
dtype: int64
********************
布尔索引 张三 -1
王五 3
dtype: int64
********************
条件索引 李四 2
王五 3
dtype: int64
********************
多条件索引 张三 -1
dtype: int64
********************
索引重命名 张三1 -1
李四 2
王五 3
dtype: int64
********************
获取索引 Index(['张三', '李四', '王五'], dtype='object')
********************
获取标签 Index(['张三', '李四', '王五'], dtype='object')
********************
获取值 [-1 2 3]
********************
获取数据类型 int64
DataFrame 对象
创建DataFrame
import pandas as pd
import numpy as np
from sqlalchemy import create_engine
# 1 使用字典方式
data = pd.DataFrame({"Column1": [1, 2, 3],
"Column2": ["A", "B", "C"],
'Column3':'f' # 所有列都为f
})
# 2 使用列表方式
data = pd.DataFrame([[1, "A"], [2, "B"], [3, "C"]], columns=["Column1", "Column2"])
# 3 使用NumPy数组
data = pd.DataFrame(np.array([[1, "A"], [2, "B"], [3, "C"]]))
# 4 使用Series
series1 = pd.Series([1, 2, 3], name="Column1")
series2 = pd.Series(["A", "B", "C"], name="Column2")
data = pd.DataFrame([series1, series2])
# 5 使用文件读取
data = pd.read_excel("测试数据.xlsx",sheet_name="人物")
# 6 使用concat方法
# concat 函数用于沿一个轴将多个对象堆叠到一起。它主要用于在不考虑索引的情况下,将多个数据集(如Series或DataFrame)合并成一个数据集。
df1 = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
df2 = pd.DataFrame({"A": [5, 6], "B": [7, 8]})
data = pd.concat([df1, df2], ignore_index=True)
# 7 merge方法
# merge 函数用于执行数据库风格的联接操作,它基于一个或多个键将不同的数据集连接起来。
df1 = pd.DataFrame({"key": ["A", "B"], "value": [1, 2]})
df2 = pd.DataFrame({"key": ["B", "C"], "value": [3, 4]})
data = pd.merge(df1, df2, on="key", how="inner")
# 8 数据库读取方法
engine = create_engine("sqlite:///pandas.db")
data = pd.read_sql_table("pandas", engine)
data
|
index |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
0 |
0 |
昨天 |
07月25日 |
白天阴 |
0% |
最高温度34℃ |
最低温度27℃ |
夜间小雨 |
85% |
南风 |
3级 |
空气质量优 |
1 |
1 |
今天 |
07月26日 |
白天小雨 |
85% |
最高温度32℃ |
最低温度26℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
2 |
2 |
星期六 |
07月27日 |
白天小雨 |
80% |
最高温度31℃ |
最低温度27℃ |
夜间小雨 |
85% |
东南风 |
3级 |
空气质量优 |
3 |
3 |
星期日 |
07月28日 |
白天阴 |
0% |
最高温度33℃ |
最低温度27℃ |
夜间阴 |
0% |
南风 |
3级 |
空气质量优 |
4 |
4 |
星期一 |
07月29日 |
白天小雨 |
80% |
最高温度34℃ |
最低温度27℃ |
夜间小雨 |
85% |
南风 |
3级 |
空气质量优 |
5 |
5 |
星期二 |
07月30日 |
白天小雨 |
85% |
最高温度32℃ |
最低温度25℃ |
夜间中雨 |
90% |
西风 |
3级 |
空气质量优 |
6 |
6 |
星期三 |
07月31日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度26℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
7 |
7 |
星期四 |
08月01日 |
白天中雨 |
90% |
最高温度33℃ |
最低温度25℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
8 |
8 |
星期五 |
08月02日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度25℃ |
夜间小雨 |
85% |
西南风 |
1级 |
空气质量优 |
9 |
9 |
星期六 |
08月03日 |
白天小雨 |
85% |
最高温度30℃ |
最低温度26℃ |
夜间晴 |
0% |
南风 |
1级 |
空气质量优 |
10 |
10 |
星期日 |
08月04日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度26℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
11 |
11 |
星期一 |
08月05日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度25℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
12 |
12 |
星期二 |
08月06日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度26℃ |
夜间阴 |
0% |
东南风 |
1级 |
空气质量优 |
13 |
13 |
星期三 |
08月07日 |
白天多云 |
0% |
最高温度31℃ |
最低温度24℃ |
夜间晴 |
0% |
东南风 |
1级 |
空气质量优 |
14 |
14 |
星期四 |
08月08日 |
白天小雨 |
85% |
最高温度29℃ |
最低温度24℃ |
夜间多云 |
0% |
东北风 |
1级 |
空气质量优 |
15 |
15 |
星期五 |
08月09日 |
白天小雨 |
85% |
最高温度29℃ |
最低温度24℃ |
夜间阴 |
0% |
东北风 |
1级 |
空气质量优 |
DataFrame的重要属性
data = pd.DataFrame(
{"Column1": [1, 2, 3], "Column2": ["A", "B", "C"], "Column3": "f"} # 所有列都为f
)
pd.set_option("display.unicode.east_asian_width", True) # 规整格式
print(data)
print("*" * 20 + "查看所有元素的值" + "*" * 20)
print(data.values)
print("*" * 20 + "所有元素的类型" + "*" * 20)
print(data.dtypes)
print("*" * 20 + "查看所有行名" + "*" * 20)
print(data.index)
print("*" * 20 + "查看所有列名" + "*" * 20)
print(data.columns)
print("*" * 20 + "查看数据集的维度" + "*" * 20)
print(data.shape)
print("*" * 20 + "行列转换" + "*" * 20)
print(data.size )
print("*" * 20 + "查看数据的大小" + "*" * 20)
print(data.T)
print("*" * 20 + "查看索引、数据类型、内存信息"+"*" * 20)
print(data.info)
Column1 Column2 Column3
0 1 A f
1 2 B f
2 3 C f
********************查看所有元素的值********************
[[1 'A' 'f']
[2 'B' 'f']
[3 'C' 'f']]
********************所有元素的类型********************
Column1 int64
Column2 object
Column3 object
dtype: object
********************查看所有行名********************
RangeIndex(start=0, stop=3, step=1)
********************查看所有列名********************
Index(['Column1', 'Column2', 'Column3'], dtype='object')
********************查看数据集的维度********************
(3, 3)
********************行列转换********************
9
********************行列转换********************
0 1 2
Column1 1 2 3
Column2 A B C
Column3 f f f
********************查看索引、数据类型、内存信息********************
<bound method DataFrame.info of Column1 Column2 Column3
0 1 A f
1 2 B f
2 3 C f>
DataFrame抽取数据
import pandas as pd
df = pd.read_excel("测试数据.xlsx",sheet_name="成绩表")
df.set_index("姓名",inplace=True)
df
|
语文 |
数学 |
英语 |
姓名 |
|
|
|
朱楠 |
85 |
11 |
90 |
李鹏 |
0 |
69 |
68 |
党杰 |
3 |
44 |
94 |
王洁 |
92 |
73 |
8 |
韩健 |
86 |
93 |
72 |
范晶 |
26 |
16 |
9 |
张娜 |
36 |
45 |
5 |
林建 |
81 |
64 |
72 |
李秀荣 |
32 |
85 |
37 |
雷桂芝 |
29 |
26 |
87 |
标签抽取loc,at
抽取整行
print('-'*20+'提取单行数据'+'-'*20)
print(df.loc["朱楠"])
print("-" * 20 + "提取多行数据" + "-" * 20)
print(df.loc[["朱楠", "王洁"]])
print("-" * 20 + "提取连续多行数据" + "-" * 20)
print(df.loc["朱楠":"王洁"])
print("-" * 20 + "提取单列数据" + "-" * 20)
print(df.loc[:, '数学']) # 逗号的左侧为行,右侧为列
print("-" * 20 + "提取多列数据" + "-" * 20)
print(df.loc[:, ["数学","英语"]])
print("-" * 20 + "提取连续列数据" + "-" * 20)
print(df.loc[:, "语文":"英语"])
print("-" * 20 + "提取多行多列数据" + "-" * 20)
print(df.loc[["朱楠", "王洁"], ["语文", "数学"]])
print("-" * 20 + "提取指定数据" + "-" * 20)
print(df.loc["朱楠", "语文"])
print("-" * 20 + "提取指区域数据" + "-" * 20)
print(df.loc["朱楠":"王洁", "语文":"数学"])
print(df.loc[["朱楠", "王洁"], ["语文", "数学"]])
print("-" * 20 + "提取单个数据" + "-" * 20)
print(df.loc["朱楠", "语文"])
print("-" * 20 + "按条件提取数据" + "-" * 20)
print(df.loc[df['语文']> 50])
print("-" * 20 + "按多条件提取数据" + "-" * 20)
print(df.loc[(df["语文"] > 50) & (df["数学"] > 50)])
--------------------提取单行数据--------------------
语文 85
数学 11
英语 90
Name: 朱楠, dtype: int64
--------------------提取多行数据--------------------
语文 数学 英语
姓名
朱楠 85 11 90
王洁 92 73 8
--------------------提取连续多行数据--------------------
语文 数学 英语
姓名
朱楠 85 11 90
李鹏 0 69 68
党杰 3 44 94
王洁 92 73 8
--------------------提取单列数据--------------------
姓名
朱楠 11
李鹏 69
党杰 44
王洁 73
韩健 93
范晶 16
张娜 45
林建 64
李秀荣 85
雷桂芝 26
Name: 数学, dtype: int64
--------------------提取多列数据--------------------
数学 英语
姓名
朱楠 11 90
李鹏 69 68
党杰 44 94
王洁 73 8
韩健 93 72
范晶 16 9
张娜 45 5
林建 64 72
李秀荣 85 37
雷桂芝 26 87
--------------------提取连续列数据--------------------
语文 数学 英语
姓名
朱楠 85 11 90
李鹏 0 69 68
党杰 3 44 94
王洁 92 73 8
韩健 86 93 72
范晶 26 16 9
张娜 36 45 5
林建 81 64 72
李秀荣 32 85 37
雷桂芝 29 26 87
--------------------提取多行多列数据--------------------
语文 数学
姓名
朱楠 85 11
王洁 92 73
--------------------提取指定数据--------------------
85
--------------------提取指区域数据--------------------
语文 数学
姓名
朱楠 85 11
李鹏 0 69
党杰 3 44
王洁 92 73
语文 数学
姓名
朱楠 85 11
王洁 92 73
--------------------提取单个数据--------------------
85
--------------------按条件提取数据--------------------
语文 数学 英语
姓名
朱楠 85 11 90
王洁 92 73 8
韩健 86 93 72
林建 81 64 72
--------------------按多条件提取数据--------------------
语文 数学 英语
姓名
王洁 92 73 8
韩健 86 93 72
林建 81 64 72
提取单个值
a = df.at["党杰","数学"]
type(a)
numpy.int64
import pandas as pd
# 创建一个示例 DataFrame
df = pd.DataFrame(
{"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, 9]}, index=["row1", "row2", "row3"]
)
# # 读取 'row2' 行 'A' 列的值
# value = df.at["row2", "A"]
# print(value) # 输出: 2
# # 将 'row2' 行 'B' 列的值更新为 10
# df.at["row2", "B"] = 10
print(df.at['row1','B'])
4
位置抽取iloc
print("-" * 20 + "提取单行数据" + "-" * 20)
print(df.iloc[0])
print("-" * 20 + "提取多行数据" + "-" * 20)
print(df.iloc[[0,1]])
print("-" * 20 + "提取连续多行数据" + "-" * 20)
print(df.iloc[0:3])
print("-" * 20 + "提取单列数据" + "-" * 20)
print(df.iloc[:, 0]) # 逗号的左侧为行,右侧为列
print("-" * 20 + "提取多列数据" + "-" * 20)
print(df.iloc[:, [0,1]])
print("-" * 20 + "提取连续列数据" + "-" * 20)
print(df.iloc[:, 0:3])
print("-" * 20 + "提取多行多列数据" + "-" * 20)
print(df.iloc[0:3, 0:3])
print("-" * 20 + "提取单个数据" + "-" * 20)
print(df.iloc[0, 0])
print("-" * 20 + "提取多个连续数据" + "-" * 20)
print(df.iloc[0:3, 0:3])
print("-" * 20 + "提取多个非连续数据" + "-" * 20)
print(df.iloc[[0,2],[0,2]])
print("-" * 20 + "按条件提取数据" + "-" * 20)
--------------------提取单行数据--------------------
语文 85
数学 11
英语 90
Name: 朱楠, dtype: int64
--------------------提取多行数据--------------------
语文 数学 英语
姓名
朱楠 85 11 90
李鹏 0 69 68
--------------------提取连续多行数据--------------------
语文 数学 英语
姓名
朱楠 85 11 90
李鹏 0 69 68
党杰 3 44 94
--------------------提取单列数据--------------------
姓名
朱楠 85
李鹏 0
党杰 3
王洁 92
韩健 86
范晶 26
张娜 36
林建 81
李秀荣 32
雷桂芝 29
Name: 语文, dtype: int64
--------------------提取多列数据--------------------
语文 数学
姓名
朱楠 85 11
李鹏 0 69
党杰 3 44
王洁 92 73
韩健 86 93
范晶 26 16
张娜 36 45
林建 81 64
李秀荣 32 85
雷桂芝 29 26
--------------------提取连续列数据--------------------
语文 数学 英语
姓名
朱楠 85 11 90
李鹏 0 69 68
党杰 3 44 94
王洁 92 73 8
韩健 86 93 72
范晶 26 16 9
张娜 36 45 5
林建 81 64 72
李秀荣 32 85 37
雷桂芝 29 26 87
--------------------提取多行多列数据--------------------
语文 数学 英语
姓名
朱楠 85 11 90
李鹏 0 69 68
党杰 3 44 94
--------------------提取单个数据--------------------
85
--------------------提取多个连续数据--------------------
语文 数学 英语
姓名
朱楠 85 11 90
李鹏 0 69 68
党杰 3 44 94
--------------------提取多个非连续数据--------------------
语文 英语
姓名
朱楠 85 90
党杰 3 94
--------------------按条件提取数据--------------------
抽取列数据
print("-" * 20 + "提取单列数据" + "-" * 20)
print(df["数学"])
print("-" * 20 + "提取多列数据" + "-" * 20)
print(df[["数学", "语文"]])
print("-" * 20 + "提取连续列数据" + "-" * 20)
print(df.loc[:,'语文':'英语'])
--------------------提取单列数据--------------------
姓名
朱楠 11
李鹏 69
党杰 44
王洁 73
韩健 93
范晶 16
张娜 45
林建 64
李秀荣 85
雷桂芝 26
Name: 数学, dtype: int64
--------------------提取多列数据--------------------
数学 语文
姓名
朱楠 11 85
李鹏 69 0
党杰 44 3
王洁 73 92
韩健 93 86
范晶 16 26
张娜 45 36
林建 64 81
李秀荣 85 32
雷桂芝 26 29
--------------------提取连续列数据--------------------
语文 数学 英语
姓名
朱楠 85 11 90
李鹏 0 69 68
党杰 3 44 94
王洁 92 73 8
韩健 86 93 72
范晶 26 16 9
张娜 36 45 5
林建 81 64 72
李秀荣 32 85 37
雷桂芝 29 26 87
数据的增删改
import pandas as pd
df = pd.read_excel("测试数据.xlsx", sheet_name="成绩表")
print(df.columns,df.index)
Index(['姓名', '语文', '数学', '英语'], dtype='object') RangeIndex(start=0, stop=10, step=1)
DataFrame增加数据
按列增加
print("-" * 20 + "直接赋值方式" + "-" * 20)
df["政治"] = [90, 80, 70, 34, 23, 65, 76, 87, 58, 10]
print(df)
print("-" * 20 + "loc方式" + "-" * 20)
df.loc[:, "化学"] = [60, 80, 70, 34, 23, 65, 76, 87, 58, 10]
print(df)
print("-" * 20 + "指定位置方式" + "-" * 20)
df.insert(2, '物理', [90, 80, 70,34,23,65,76,87,58,10])
df
--------------------直接赋值方式--------------------
姓名 语文 数学 英语 政治
0 朱楠 85 11 90 90
1 李鹏 0 69 68 80
2 党杰 3 44 94 70
3 王洁 92 73 8 34
4 韩健 86 93 72 23
5 范晶 26 16 9 65
6 张娜 36 45 5 76
7 林建 81 64 72 87
8 李秀荣 32 85 37 58
9 雷桂芝 29 26 87 10
--------------------loc方式--------------------
姓名 语文 数学 英语 政治 化学
0 朱楠 85 11 90 90 60
1 李鹏 0 69 68 80 80
2 党杰 3 44 94 70 70
3 王洁 92 73 8 34 34
4 韩健 86 93 72 23 23
5 范晶 26 16 9 65 65
6 张娜 36 45 5 76 76
7 林建 81 64 72 87 87
8 李秀荣 32 85 37 58 58
9 雷桂芝 29 26 87 10 10
--------------------指定位置方式--------------------
|
姓名 |
语文 |
物理 |
数学 |
英语 |
政治 |
化学 |
0 |
朱楠 |
85 |
90 |
11 |
90 |
90 |
60 |
1 |
李鹏 |
0 |
80 |
69 |
68 |
80 |
80 |
2 |
党杰 |
3 |
70 |
44 |
94 |
70 |
70 |
3 |
王洁 |
92 |
34 |
73 |
8 |
34 |
34 |
4 |
韩健 |
86 |
23 |
93 |
72 |
23 |
23 |
5 |
范晶 |
26 |
65 |
16 |
9 |
65 |
65 |
6 |
张娜 |
36 |
76 |
45 |
5 |
76 |
76 |
7 |
林建 |
81 |
87 |
64 |
72 |
87 |
87 |
8 |
李秀荣 |
32 |
58 |
85 |
37 |
58 |
58 |
9 |
雷桂芝 |
29 |
10 |
26 |
87 |
10 |
10 |
按行增加
import pandas as pd
df = pd.read_excel("测试数据.xlsx", sheet_name="成绩表",index_col=0)
new_df = pd.DataFrame(
data={"语文": [45, 56, 67], "数学": [65, 45, 67], "英语": [200, 50, 67]},
index=["张丽", "李广", "王琦"],
)
print("-" * 20 + "loc方式" + "-" * 20)
df.loc['陈六'] = [10,20,30]
print("-" * 20 + "concat方式" + "-" * 20)
df = pd.concat([df,new_df])
df
--------------------loc方式--------------------
--------------------concat方式--------------------
|
语文 |
数学 |
英语 |
朱楠 |
85 |
11 |
90 |
李鹏 |
0 |
69 |
68 |
党杰 |
3 |
44 |
94 |
王洁 |
92 |
73 |
8 |
韩健 |
86 |
93 |
72 |
范晶 |
26 |
16 |
9 |
张娜 |
36 |
45 |
5 |
林建 |
81 |
64 |
72 |
李秀荣 |
32 |
85 |
37 |
雷桂芝 |
29 |
26 |
87 |
陈六 |
10 |
20 |
30 |
张丽 |
45 |
65 |
200 |
李广 |
56 |
45 |
50 |
王琦 |
67 |
67 |
67 |
DataFrame修改数据
import pandas as pd
df = pd.read_excel("测试数据.xlsx", sheet_name="成绩表", index_col=0)
df
|
语文 |
数学 |
英语 |
姓名 |
|
|
|
朱楠 |
85 |
11 |
90 |
李鹏 |
0 |
69 |
68 |
党杰 |
3 |
44 |
94 |
王洁 |
92 |
73 |
8 |
韩健 |
86 |
93 |
72 |
范晶 |
26 |
16 |
9 |
张娜 |
36 |
45 |
5 |
林建 |
81 |
64 |
72 |
李秀荣 |
32 |
85 |
37 |
雷桂芝 |
29 |
26 |
87 |
修改列标题
# 修改列标题
df.columns = ['a','b','c']
print(df)
df.rename(columns={'a':'语文','b':'数学','c':'英语'},inplace=True)
print(df)
a b c
姓名
朱楠 85 11 90
李鹏 0 69 68
党杰 3 44 94
王洁 92 73 8
韩健 86 93 72
范晶 26 16 9
张娜 36 45 5
林建 81 64 72
李秀荣 32 85 37
雷桂芝 29 26 87
语文 数学 英语
姓名
朱楠 85 11 90
李鹏 0 69 68
党杰 3 44 94
王洁 92 73 8
韩健 86 93 72
范晶 26 16 9
张娜 36 45 5
林建 81 64 72
李秀荣 32 85 37
雷桂芝 29 26 87
修改列标题
df.index = list('1234567891')
print(df)
df.rename({'1':'张三','2':'李四','3':'王五'},inplace=True,axis=0)
print(df)
语文 数学 英语
1 85 11 90
2 0 69 68
3 3 44 94
4 92 73 8
5 86 93 72
6 26 16 9
7 36 45 5
8 81 64 72
9 32 85 37
1 29 26 87
语文 数学 英语
张三 85 11 90
李四 0 69 68
王五 3 44 94
4 92 73 8
5 86 93 72
6 26 16 9
7 36 45 5
8 81 64 72
9 32 85 37
张三 29 26 87
修改数据
# 修改整行
df.loc["张三"] = [100, 100, 120]
df.iloc[0, :] = [45, 65, 200]
df
|
语文 |
数学 |
英语 |
张三 |
45 |
65 |
200 |
李四 |
0 |
69 |
68 |
王五 |
3 |
44 |
94 |
4 |
92 |
73 |
8 |
5 |
86 |
93 |
72 |
6 |
26 |
16 |
9 |
7 |
36 |
45 |
5 |
8 |
81 |
64 |
72 |
9 |
32 |
85 |
37 |
张三 |
100 |
100 |
120 |
# 修改列
df.loc[:,'数学'] = [80,90,100,101,102,103,104,105,106,104]
df.iloc[:, 1] = [65, 45, 67, 101, 102, 103, 104, 105, 106, 104]
df
|
语文 |
数学 |
英语 |
张三 |
45 |
65 |
200 |
李四 |
0 |
45 |
68 |
王五 |
3 |
67 |
94 |
4 |
92 |
101 |
8 |
5 |
86 |
102 |
72 |
6 |
26 |
103 |
9 |
7 |
36 |
104 |
5 |
8 |
81 |
105 |
72 |
9 |
32 |
106 |
37 |
张三 |
100 |
104 |
120 |
# 修改某一个数据
df.loc["张三", "英语"] = 90
df.iloc[1,2] = 50
df
|
语文 |
数学 |
英语 |
张三 |
45 |
65 |
90 |
李四 |
0 |
45 |
50 |
王五 |
3 |
67 |
94 |
4 |
92 |
101 |
8 |
5 |
86 |
102 |
72 |
6 |
26 |
103 |
9 |
7 |
36 |
104 |
5 |
8 |
81 |
105 |
72 |
9 |
32 |
106 |
37 |
张三 |
100 |
104 |
90 |
删除数据
import pandas as pd
df = pd.read_excel("测试数据.xlsx", sheet_name="成绩表", index_col=0)
df
|
语文 |
数学 |
英语 |
姓名 |
|
|
|
朱楠 |
85 |
11 |
90 |
李鹏 |
0 |
69 |
68 |
党杰 |
3 |
44 |
94 |
王洁 |
92 |
73 |
8 |
韩健 |
86 |
93 |
72 |
范晶 |
26 |
16 |
9 |
张娜 |
36 |
45 |
5 |
林建 |
81 |
64 |
72 |
李秀荣 |
32 |
85 |
37 |
雷桂芝 |
29 |
26 |
87 |
df = pd.read_excel("测试数据.xlsx", sheet_name="成绩表", index_col=0)
# 删除整列
# df.drop(['数学'],axis=1,inplace=True)
# df.drop(columns='数学',inplace=True)
# df.drop(labels='数学',axis=1,inplace=True)
# 删除整行
# df.drop(labels="朱楠", axis=0, inplace=True)
# df.drop(index='朱楠',inplace=True)
# df.drop(labels='朱楠',axis=0,inplace=True)
df.drop(df[df["数学"] < 60].index, inplace=True)
df
|
语文 |
数学 |
英语 |
姓名 |
|
|
|
李鹏 |
0 |
69 |
68 |
王洁 |
92 |
73 |
8 |
韩健 |
86 |
93 |
72 |
林建 |
81 |
64 |
72 |
李秀荣 |
32 |
85 |
37 |
查看数据
import pandas as pd
df = pd.read_excel("测试数据.xlsx", sheet_name="缺失数据", index_col=0,header=0)
s = df["数学"]
查看顶部,底部与随机数据
print(df.head(2)) # 顶部2行
print(df.tail(2)) # 底部2行
print(df.sample(2)) # 随机2行
语文 数学 英语
姓名
朱楠 85.0 11.0 90.0
李鹏 0.0 69.0 68.0
语文 数学 英语
姓名
李秀荣 32.0 NaN 37.0
雷桂芝 29.0 26.0 87.0
语文 数学 英语
姓名
韩健 86.0 93.0 72.0
范晶 26.0 16.0 9.0
查看行列索引
print(df.index) # 行索引
print(df.columns) # 列索引
print(s.keys()) # Series的索引,DataFrame的列名
print(df.axes) # 行列索引内容
print(s.name) # Series的名字
Index(['朱楠', '李鹏', '党杰', '王洁', '韩健', '范晶', '张娜', '林建', '李秀荣', '雷桂芝'], dtype='object', name='姓名')
Index(['语文', '数学', '英语'], dtype='object')
Index(['朱楠', '李鹏', '党杰', '王洁', '韩健', '范晶', '张娜', '林建', '李秀荣', '雷桂芝'], dtype='object', name='姓名')
[Index(['朱楠', '李鹏', '党杰', '王洁', '韩健', '范晶', '张娜', '林建', '李秀荣', '雷桂芝'], dtype='object', name='姓名'), Index(['语文', '数学', '英语'], dtype='object')]
数学
查看数据形状
print(df.shape) # 查看数据集的行数和列数
print(df.ndim) # 查看数据集的维度
(10, 3)
2
查看基础信息
df.info() # 查看数据信息
<class 'pandas.core.frame.DataFrame'>
Index: 10 entries, 朱楠 to 雷桂芝
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 语文 9 non-null float64
1 数学 9 non-null float64
2 英语 9 non-null float64
dtypes: float64(3)
memory usage: 620.0+ bytes
数据类型
df.dtypes # 查看数据类型
语文 float64
数学 float64
英语 float64
dtype: object
查看值
print(df.values) # 查看所有值的矩阵
print("*"*100)
print(df.__array__()) # 查看所有值的矩阵
[[85. 11. 90.]
[ 0. 69. 68.]
[ 3. 44. 94.]
[nan 73. 8.]
[86. 93. 72.]
[26. 16. 9.]
[36. 45. nan]
[81. 64. 72.]
[32. nan 37.]
[29. 26. 87.]]
****************************************************************************************************
[[85. 11. 90.]
[ 0. 69. 68.]
[ 3. 44. 94.]
[nan 73. 8.]
[86. 93. 72.]
[26. 16. 9.]
[36. 45. nan]
[81. 64. 72.]
[32. nan 37.]
[29. 26. 87.]]
判断
df.empty # 判断数据是否为空 True为空,Flase 不为空
False
查看数据的数量
print(df.size ) # 600行×列的总数,就是总共有多少数据
print(len(df))
30
10
查看缺失值
print(df.isnull()) # 查看有哪些数据为空
print(df.notnull()) # 查看哪些数据不为空
print(s.hasnans) # 查看该Series数据是否为空
print(df.isna()) # 查看哪些数据为空
语文 数学 英语
姓名
朱楠 False False False
李鹏 False False False
党杰 False False False
王洁 True False False
韩健 False False False
范晶 False False False
张娜 False False True
林建 False False False
李秀荣 False True False
雷桂芝 False False False
语文 数学 英语
姓名
朱楠 True True True
李鹏 True True True
党杰 True True True
王洁 False True True
韩健 True True True
范晶 True True True
张娜 True True False
林建 True True True
李秀荣 True False True
雷桂芝 True True True
True
语文 数学 英语
姓名
朱楠 False False False
李鹏 False False False
党杰 False False False
王洁 True False False
韩健 False False False
范晶 False False False
张娜 False False True
林建 False False False
李秀荣 False True False
雷桂芝 False False False
数据选择
数据清洗
df = pd.read_excel("测试数据.xlsx", sheet_name="缺失数据", index_col=0)
查看缺失值
df.info() # 查看数据信息
"""
Index: 10
0 语文 9 non-null float64
1 数学 9 non-null float64
2 英语 9 non-null float64
"""
<class 'pandas.core.frame.DataFrame'>
Index: 10 entries, 朱楠 to 雷桂芝
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 语文 9 non-null float64
1 数学 9 non-null float64
2 英语 9 non-null float64
dtypes: float64(3)
memory usage: 320.0+ bytes
df.isna # 查看缺失值
"""
王洁 NaN 73.0 8.0
张娜 36.0 45.0 NaN
李秀荣 32.0 NaN 37.0
"""
<bound method DataFrame.isna of 语文 数学 英语
姓名
朱楠 85.0 11.0 90.0
李鹏 0.0 69.0 68.0
党杰 3.0 44.0 94.0
王洁 NaN 73.0 8.0
韩健 86.0 93.0 72.0
范晶 26.0 16.0 9.0
张娜 36.0 45.0 NaN
林建 81.0 64.0 72.0
李秀荣 32.0 NaN 37.0
雷桂芝 29.0 26.0 87.0>
print(df.isnull()) # 查看有哪些数据为空
print(df.isna()) # 查看哪些数据为空
"""
王洁 True False False
张娜 False False True
李秀荣 False True False
"""
语文 数学 英语
姓名
朱楠 False False False
李鹏 False False False
党杰 False False False
王洁 True False False
韩健 False False False
范晶 False False False
张娜 False False True
林建 False False False
李秀荣 False True False
雷桂芝 False False False
语文 数学 英语
姓名
朱楠 False False False
李鹏 False False False
党杰 False False False
王洁 True False False
韩健 False False False
范晶 False False False
张娜 False False True
林建 False False False
李秀荣 False True False
雷桂芝 False False False
'\n王洁 True False False\n张娜 False False True\n李秀荣 False True False\n'
print(df.notnull()) # 查看哪些数据不为空
"""
王洁 False True True
张娜 True True False
雷桂芝 True True True
"""
语文 数学 英语
姓名
朱楠 True True True
李鹏 True True True
党杰 True True True
王洁 False True True
韩健 True True True
范晶 True True True
张娜 True True False
林建 True True True
李秀荣 True False True
雷桂芝 True True True
print(df['语文'].hasnans) # 查看该列数据是否为空
df['语文'].isnull() # 查看该列数据是否为空
df["语文"].notna() # 查看该列数据是否为空
df["语文"].notnull() # 查看该列数据是否为空
True
姓名
朱楠 True
李鹏 True
党杰 True
王洁 False
韩健 True
范晶 True
张娜 True
林建 True
李秀荣 True
雷桂芝 True
Name: 语文, dtype: bool
缺失值统计
df.isnull().sum() # 统计列缺少的数据
语文 1
数学 1
英语 1
dtype: int64
df.isnull().sum(1) # 统计行缺少的数据
姓名
朱楠 0
李鹏 0
党杰 0
王洁 1
韩健 0
范晶 0
张娜 1
林建 0
李秀荣 1
雷桂芝 0
dtype: int64
缺失值筛选
# 有缺失值的行
df.loc[df.isna().any(axis=1)]
|
语文 |
数学 |
英语 |
姓名 |
|
|
|
王洁 |
NaN |
73.0 |
8.0 |
张娜 |
36.0 |
45.0 |
NaN |
李秀荣 |
32.0 |
NaN |
37.0 |
# 有缺失值的列
df.loc[:, df.isna().any(axis=0)]
|
语文 |
数学 |
英语 |
姓名 |
|
|
|
朱楠 |
85.0 |
11.0 |
90.0 |
李鹏 |
0.0 |
69.0 |
68.0 |
党杰 |
3.0 |
44.0 |
94.0 |
王洁 |
NaN |
73.0 |
8.0 |
韩健 |
86.0 |
93.0 |
72.0 |
范晶 |
26.0 |
16.0 |
9.0 |
张娜 |
36.0 |
45.0 |
NaN |
林建 |
81.0 |
64.0 |
72.0 |
李秀荣 |
32.0 |
NaN |
37.0 |
雷桂芝 |
29.0 |
26.0 |
87.0 |
# 没有缺失值的行
df.loc[~(df.isna().any(axis=1))]
|
语文 |
数学 |
英语 |
姓名 |
|
|
|
朱楠 |
85.0 |
11.0 |
90.0 |
李鹏 |
0.0 |
69.0 |
68.0 |
党杰 |
3.0 |
44.0 |
94.0 |
韩健 |
86.0 |
93.0 |
72.0 |
范晶 |
26.0 |
16.0 |
9.0 |
林建 |
81.0 |
64.0 |
72.0 |
雷桂芝 |
29.0 |
26.0 |
87.0 |
# 没有缺失值的列
df.loc[:, ~(df.isna().any())]
|
姓名 |
朱楠 |
李鹏 |
党杰 |
王洁 |
韩健 |
范晶 |
张娜 |
林建 |
李秀荣 |
雷桂芝 |
s = pd.Series([1, 2, None, 4], dtype="Int64")
s
0 1
1 2
2 <NA>
3 4
dtype: Int64
缺失值处理方式
删除缺失值的行
# 删除缺失值
print(df)
df = df.dropna()
print(df)
语文 数学 英语
姓名
朱楠 85.0 11.0 90.0
李鹏 0.0 69.0 68.0
党杰 3.0 44.0 94.0
王洁 NaN 73.0 8.0
韩健 86.0 93.0 72.0
范晶 26.0 16.0 9.0
张娜 36.0 45.0 NaN
林建 81.0 64.0 72.0
李秀荣 32.0 NaN 37.0
雷桂芝 29.0 26.0 87.0
语文 数学 英语
姓名
朱楠 85.0 11.0 90.0
李鹏 0.0 69.0 68.0
党杰 3.0 44.0 94.0
韩健 86.0 93.0 72.0
范晶 26.0 16.0 9.0
林建 81.0 64.0 72.0
雷桂芝 29.0 26.0 87.0
# 提取单列数据部位NaN的值
df = pd.read_excel("pandas.xlsx")
df[df["空气质量优"].notnull()]
|
昨天 |
07月25日 |
白天阴 |
0% |
最高温度34℃ |
最低温度27℃ |
夜间小雨 |
85% |
南风 |
3级 |
空气质量优 |
0 |
今天 |
07月26日 |
白天小雨 |
85% |
最高温度32℃ |
最低温度26℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
1 |
星期六 |
07月27日 |
白天小雨 |
80% |
最高温度31℃ |
最低温度27℃ |
夜间小雨 |
85% |
东南风 |
3级 |
空气质量优 |
2 |
星期日 |
07月28日 |
NaN |
0% |
最高温度33℃ |
最低温度27℃ |
夜间阴 |
0% |
南风 |
3级 |
空气质量优 |
3 |
星期一 |
07月29日 |
白天小雨 |
80% |
最高温度34℃ |
最低温度27℃ |
夜间小雨 |
85% |
南风 |
3级 |
空气质量优 |
4 |
星期二 |
07月30日 |
白天小雨 |
85% |
最高温度32℃ |
最低温度25℃ |
夜间中雨 |
90% |
西风 |
3级 |
空气质量优 |
5 |
星期三 |
07月31日 |
白天小雨 |
NaN |
最高温度31℃ |
最低温度26℃ |
夜间小雨 |
NaN |
东南风 |
1级 |
空气质量优 |
6 |
星期四 |
08月01日 |
白天中雨 |
90% |
最高温度33℃ |
最低温度25℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
8 |
星期六 |
08月03日 |
白天小雨 |
85% |
最高温度30℃ |
最低温度26℃ |
夜间晴 |
0% |
南风 |
1级 |
空气质量优 |
9 |
星期日 |
08月04日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度26℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
10 |
星期一 |
08月05日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度25℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
11 |
星期二 |
08月06日 |
白天小雨 |
85% |
NaN |
最低温度26℃ |
夜间阴 |
0% |
东南风 |
1级 |
空气质量优 |
12 |
星期三 |
08月07日 |
白天多云 |
0% |
最高温度31℃ |
最低温度24℃ |
夜间晴 |
0% |
东南风 |
1级 |
空气质量优 |
13 |
星期四 |
08月08日 |
白天小雨 |
85% |
最高温度29℃ |
最低温度24℃ |
夜间多云 |
0% |
东北风 |
1级 |
空气质量优 |
14 |
星期五 |
08月09日 |
白天小雨 |
85% |
最高温度29℃ |
最低温度24℃ |
夜间阴 |
0% |
东北风 |
1级 |
空气质量优 |
15 |
星期五 |
08月09日 |
白天小雨 |
85% |
最高温度29℃ |
最低温度24℃ |
夜间阴 |
0% |
东北风 |
1级 |
空气质量优 |
16 |
星期日 |
07月28日 |
NaN |
0% |
最高温度33℃ |
最低温度27℃ |
夜间阴 |
0% |
南风 |
3级 |
空气质量优 |
# 填充缺失值
df["空气质量优"].fillna("空气质量优")
0 空气质量优
1 空气质量优
2 空气质量优
3 空气质量优
4 空气质量优
5 空气质量优
6 空气质量优
7 空气质量优
8 空气质量优
9 空气质量优
10 空气质量优
11 空气质量优
12 空气质量优
13 空气质量优
14 空气质量优
15 空气质量优
16 空气质量优
Name: 空气质量优, dtype: object
# 插值
重复值处理
df = pd.read_excel("pandas.xlsx")
# 判断重复值
df.duplicated()
0 False
1 False
2 False
3 False
4 False
5 False
6 False
7 False
8 False
9 False
10 False
11 False
12 False
13 False
14 False
15 True
16 True
dtype: bool
# 删除所有重复值
df.drop_duplicates(inplace=True)
df
|
昨天 |
07月25日 |
白天阴 |
0% |
最高温度34℃ |
最低温度27℃ |
夜间小雨 |
85% |
南风 |
3级 |
空气质量优 |
0 |
今天 |
07月26日 |
白天小雨 |
85% |
最高温度32℃ |
最低温度26℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
1 |
星期六 |
07月27日 |
白天小雨 |
80% |
最高温度31℃ |
最低温度27℃ |
夜间小雨 |
85% |
东南风 |
3级 |
空气质量优 |
2 |
星期日 |
07月28日 |
NaN |
0% |
最高温度33℃ |
最低温度27℃ |
夜间阴 |
0% |
南风 |
3级 |
空气质量优 |
3 |
星期一 |
07月29日 |
白天小雨 |
80% |
最高温度34℃ |
最低温度27℃ |
夜间小雨 |
85% |
南风 |
3级 |
空气质量优 |
4 |
星期二 |
07月30日 |
白天小雨 |
85% |
最高温度32℃ |
最低温度25℃ |
夜间中雨 |
90% |
西风 |
3级 |
空气质量优 |
5 |
星期三 |
07月31日 |
白天小雨 |
NaN |
最高温度31℃ |
最低温度26℃ |
夜间小雨 |
NaN |
东南风 |
1级 |
空气质量优 |
6 |
星期四 |
08月01日 |
白天中雨 |
90% |
最高温度33℃ |
最低温度25℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
7 |
星期五 |
08月02日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度25℃ |
夜间小雨 |
85% |
西南风 |
1级 |
NaN |
8 |
星期六 |
08月03日 |
白天小雨 |
85% |
最高温度30℃ |
最低温度26℃ |
夜间晴 |
0% |
南风 |
1级 |
空气质量优 |
9 |
星期日 |
08月04日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度26℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
10 |
星期一 |
08月05日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度25℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
11 |
星期二 |
08月06日 |
白天小雨 |
85% |
NaN |
最低温度26℃ |
夜间阴 |
0% |
东南风 |
1级 |
空气质量优 |
12 |
星期三 |
08月07日 |
白天多云 |
0% |
最高温度31℃ |
最低温度24℃ |
夜间晴 |
0% |
东南风 |
1级 |
空气质量优 |
13 |
星期四 |
08月08日 |
白天小雨 |
85% |
最高温度29℃ |
最低温度24℃ |
夜间多云 |
0% |
东北风 |
1级 |
空气质量优 |
14 |
星期五 |
08月09日 |
白天小雨 |
85% |
最高温度29℃ |
最低温度24℃ |
夜间阴 |
0% |
东北风 |
1级 |
空气质量优 |
# 删除指定列的重复值
df = pd.read_excel("pandas.xlsx")
df = df.drop_duplicates(["空气质量优"])
df
|
昨天 |
07月25日 |
白天阴 |
0% |
最高温度34℃ |
最低温度27℃ |
夜间小雨 |
85% |
南风 |
3级 |
空气质量优 |
0 |
今天 |
07月26日 |
白天小雨 |
85% |
最高温度32℃ |
最低温度26℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
7 |
星期五 |
08月02日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度25℃ |
夜间小雨 |
85% |
西南风 |
1级 |
NaN |
# 删除指定列的重复值,保留重复值宗的最后一行
df = pd.read_excel("pandas.xlsx")
df = df.drop_duplicates(["空气质量优"],keep='last')
df
|
昨天 |
07月25日 |
白天阴 |
0% |
最高温度34℃ |
最低温度27℃ |
夜间小雨 |
85% |
南风 |
3级 |
空气质量优 |
7 |
星期五 |
08月02日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度25℃ |
夜间小雨 |
85% |
西南风 |
1级 |
NaN |
16 |
星期日 |
07月28日 |
NaN |
0% |
最高温度33℃ |
最低温度27℃ |
夜间阴 |
0% |
南风 |
3级 |
空气质量优 |
# 删除指定列的重复值,产生副本
df = pd.read_excel("pandas.xlsx")
df1 = df.drop_duplicates(["空气质量优"], inplace=False)
print(df,df1)
昨天 07月25日 白天阴 0% 最高温度34℃ 最低温度27℃ 夜间小雨 \
0 今天 07月26日 白天小雨 85% 最高温度32℃ 最低温度26℃ 夜间小雨
1 星期六 07月27日 白天小雨 80% 最高温度31℃ 最低温度27℃ 夜间小雨
2 星期日 07月28日 NaN 0% 最高温度33℃ 最低温度27℃ 夜间阴
3 星期一 07月29日 白天小雨 80% 最高温度34℃ 最低温度27℃ 夜间小雨
4 星期二 07月30日 白天小雨 85% 最高温度32℃ 最低温度25℃ 夜间中雨
5 星期三 07月31日 白天小雨 NaN 最高温度31℃ 最低温度26℃ 夜间小雨
6 星期四 08月01日 白天中雨 90% 最高温度33℃ 最低温度25℃ 夜间小雨
7 星期五 08月02日 白天小雨 85% 最高温度31℃ 最低温度25℃ 夜间小雨
8 星期六 08月03日 白天小雨 85% 最高温度30℃ 最低温度26℃ 夜间晴
9 星期日 08月04日 白天小雨 85% 最高温度31℃ 最低温度26℃ 夜间小雨
10 星期一 08月05日 白天小雨 85% 最高温度31℃ 最低温度25℃ 夜间小雨
11 星期二 08月06日 白天小雨 85% NaN 最低温度26℃ 夜间阴
12 星期三 08月07日 白天多云 0% 最高温度31℃ 最低温度24℃ 夜间晴
13 星期四 08月08日 白天小雨 85% 最高温度29℃ 最低温度24℃ 夜间多云
14 星期五 08月09日 白天小雨 85% 最高温度29℃ 最低温度24℃ 夜间阴
15 星期五 08月09日 白天小雨 85% 最高温度29℃ 最低温度24℃ 夜间阴
16 星期日 07月28日 NaN 0% 最高温度33℃ 最低温度27℃ 夜间阴
85% 南风 3级 空气质量优
0 85% 东南风 1级 空气质量优
1 85% 东南风 3级 空气质量优
2 0% 南风 3级 空气质量优
3 85% 南风 3级 空气质量优
4 90% 西风 3级 空气质量优
5 NaN 东南风 1级 空气质量优
6 85% 东南风 1级 空气质量优
7 85% 西南风 1级 NaN
8 0% 南风 1级 空气质量优
9 85% 东南风 1级 空气质量优
10 85% 东南风 1级 空气质量优
11 0% 东南风 1级 空气质量优
12 0% 东南风 1级 空气质量优
13 0% 东北风 1级 空气质量优
14 0% 东北风 1级 空气质量优
15 0% 东北风 1级 空气质量优
16 0% 南风 3级 空气质量优 昨天 07月25日 白天阴 0% 最高温度34℃ 最低温度27℃ 夜间小雨 \
0 今天 07月26日 白天小雨 85% 最高温度32℃ 最低温度26℃ 夜间小雨
7 星期五 08月02日 白天小雨 85% 最高温度31℃ 最低温度25℃ 夜间小雨
85% 南风 3级 空气质量优
0 85% 东南风 1级 空气质量优
7 85% 西南风 1级 NaN
异常值的检测与处理
异常值的检测方法
索引
索引类型
pd.RangeIndex(1, 100, 2)
# RangeIndex(start=1, stop=100, step=2)
# pd.Int64Index([1, 2, 3, -4], name="num")
# Int64Index([1, 2, 3, -4], dtype='int64', name='num')
# pd.UInt64Index([1, 2, 3, 4])
# UInt64Index([1, 2, 3, 4], dtype='uint64')
# pd.Float64Index([1.2, 2.3, 3, 4])
# Float64Index([1.2, 2.3, 3.0, 4.0], dtype='float64')
RangeIndex(start=1, stop=100, step=2)
设置索引
Series对象
建立索引
构造时设置索引
import pandas as pd
s= pd.Series([1,2,3,4,5],index=['a','b','c','d','e'])
s.index
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
创建后设置索引
import pandas as pd
s = pd.Series([1, 2, 3, 4, 5])
print(s.index)
# 方法1
s.index = list('abcde')
print(s.index)
# 方法2
s.index = pd.Index(list('fghij'))
print(s.index)
s = pd.Series([1, 2, 3, 4, 5])
# 方法3 生成一个新的Series
s= s.reindex(range(0,8))
print(s.index)
s = pd.Series([1, 2, 3, 4, 5])
# s = s.reindex(range(0,6))
# 填充数据
s = s.reindex(range(0, 8), fill_value=0)
s = pd.Series([1, 2, 3, 4, 5])
# 向前填充
s = s.reindex(range(0,8),method='ffill')
s = pd.Series([1, 2, 3, 4, 5])
# 向后填充
# s = s.reindex(range(0,8),method='bfill')
print(s)
RangeIndex(start=0, stop=5, step=1)
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
Index(['f', 'g', 'h', 'i', 'j'], dtype='object')
RangeIndex(start=0, stop=8, step=1)
0 1
1 2
2 3
3 4
4 5
dtype: int64
重置索引
import pandas as pd
data = ['tom','jack','lis']
index = ['a','b','c']
s = pd.Series(data,index=index)
s = s.reset_index()
s.index
s
|
index |
0 |
0 |
a |
tom |
1 |
b |
jack |
2 |
c |
lis |
DataFrame对象
建立索引
读取文件时指定索引
import pandas as pd
df = pd.read_excel("测试数据.xlsx",sheet_name="成绩表",index_col=0,header=0)
# index_col=0 第0列为行索引
# header=0 第0行为列索引
print(df.index)
print(df.columns)
Index(['朱楠', '李鹏', '党杰', '王洁', '韩健', '范晶', '张娜', '林建', '李秀荣', '雷桂芝'], dtype='object', name='姓名')
Index(['语文', '数学', '英语'], dtype='object')
创建后设置索引
df = pd.read_excel("测试数据.xlsx", sheet_name="成绩表", header=None)
df1 = df.copy()
print(df1.index)
print(df1.columns)
# 方法1
df1.index = ['姓名',
"朱楠",
"李鹏",
"党杰",
"王洁",
"韩健",
"范晶",
"张娜",
"林建",
"李秀荣",
"雷桂芝",
]
df1.columns = ['姓名',"语文", "数学", "英语"]
# 方法2
df2 = df.copy()
df2.set_index([0,1], inplace=True)
df2
df3 = df.copy()
df3.reindex(
index=[
# '姓名',
"朱楠",
"李鹏",
"党杰",
"王洁",
"韩健",
"范晶",
"张娜",
"林建",
"李秀荣",
"雷桂芝",
],
columns=["语文", "数学", "英语"],
fill_value=0,
)
# print(df3.index)
# print(df3.columns)
df3.set_index(keys=0, inplace=True)
df3
RangeIndex(start=0, stop=11, step=1)
Index([0, 1, 2, 3], dtype='int64')
|
1 |
2 |
3 |
0 |
|
|
|
姓名 |
语文 |
数学 |
英语 |
朱楠 |
85 |
11 |
90 |
李鹏 |
0 |
69 |
68 |
党杰 |
3 |
44 |
94 |
王洁 |
92 |
73 |
8 |
韩健 |
86 |
93 |
72 |
范晶 |
26 |
16 |
9 |
张娜 |
36 |
45 |
5 |
林建 |
81 |
64 |
72 |
李秀荣 |
32 |
85 |
37 |
雷桂芝 |
29 |
26 |
87 |
df = pd.read_excel("测试数据.xlsx", sheet_name="天气")
df.set_index("昨天")
|
07月25日 |
白天阴 |
0% |
最高温度34℃ |
最低温度27℃ |
夜间小雨 |
85% |
南风 |
3级 |
空气质量优 |
昨天 |
|
|
|
|
|
|
|
|
|
|
今天 |
07月26日 |
白天小雨 |
85% |
最高温度32℃ |
最低温度26℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
星期六 |
07月27日 |
白天小雨 |
80% |
最高温度31℃ |
最低温度27℃ |
夜间小雨 |
85% |
东南风 |
3级 |
空气质量优 |
星期日 |
07月28日 |
NaN |
0% |
最高温度33℃ |
最低温度27℃ |
夜间阴 |
0% |
南风 |
3级 |
空气质量优 |
星期一 |
07月29日 |
白天小雨 |
80% |
最高温度34℃ |
最低温度27℃ |
夜间小雨 |
85% |
南风 |
3级 |
空气质量优 |
星期二 |
07月30日 |
白天小雨 |
85% |
最高温度32℃ |
最低温度25℃ |
夜间中雨 |
90% |
西风 |
3级 |
空气质量优 |
星期三 |
07月31日 |
白天小雨 |
NaN |
最高温度31℃ |
最低温度26℃ |
夜间小雨 |
NaN |
东南风 |
1级 |
空气质量优 |
星期四 |
08月01日 |
白天中雨 |
90% |
最高温度33℃ |
最低温度25℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
星期五 |
08月02日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度25℃ |
夜间小雨 |
85% |
西南风 |
1级 |
NaN |
星期六 |
08月03日 |
白天小雨 |
85% |
最高温度30℃ |
最低温度26℃ |
夜间晴 |
0% |
南风 |
1级 |
空气质量优 |
星期日 |
08月04日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度26℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
星期一 |
08月05日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度25℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
星期二 |
08月06日 |
白天小雨 |
85% |
NaN |
最低温度26℃ |
夜间阴 |
0% |
东南风 |
1级 |
空气质量优 |
星期三 |
08月07日 |
白天多云 |
0% |
最高温度31℃ |
最低温度24℃ |
夜间晴 |
0% |
东南风 |
1级 |
空气质量优 |
星期四 |
08月08日 |
白天小雨 |
85% |
最高温度29℃ |
最低温度24℃ |
夜间多云 |
0% |
东北风 |
1级 |
空气质量优 |
星期五 |
08月09日 |
白天小雨 |
85% |
最高温度29℃ |
最低温度24℃ |
夜间阴 |
0% |
东北风 |
1级 |
空气质量优 |
星期五 |
08月09日 |
白天小雨 |
85% |
最高温度29℃ |
最低温度24℃ |
夜间阴 |
0% |
东北风 |
1级 |
空气质量优 |
星期日 |
07月28日 |
NaN |
0% |
最高温度33℃ |
最低温度27℃ |
夜间阴 |
0% |
南风 |
3级 |
空气质量优 |
# 数据清洗后重新设置连续的索引
df.dropna(inplace=True)
df.reset_index(drop=True)
|
昨天 |
07月25日 |
白天阴 |
0% |
最高温度34℃ |
最低温度27℃ |
夜间小雨 |
85% |
南风 |
3级 |
空气质量优 |
0 |
今天 |
07月26日 |
白天小雨 |
85% |
最高温度32℃ |
最低温度26℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
1 |
星期六 |
07月27日 |
白天小雨 |
80% |
最高温度31℃ |
最低温度27℃ |
夜间小雨 |
85% |
东南风 |
3级 |
空气质量优 |
2 |
星期一 |
07月29日 |
白天小雨 |
80% |
最高温度34℃ |
最低温度27℃ |
夜间小雨 |
85% |
南风 |
3级 |
空气质量优 |
3 |
星期二 |
07月30日 |
白天小雨 |
85% |
最高温度32℃ |
最低温度25℃ |
夜间中雨 |
90% |
西风 |
3级 |
空气质量优 |
4 |
星期四 |
08月01日 |
白天中雨 |
90% |
最高温度33℃ |
最低温度25℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
5 |
星期六 |
08月03日 |
白天小雨 |
85% |
最高温度30℃ |
最低温度26℃ |
夜间晴 |
0% |
南风 |
1级 |
空气质量优 |
6 |
星期日 |
08月04日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度26℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
7 |
星期一 |
08月05日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度25℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
8 |
星期三 |
08月07日 |
白天多云 |
0% |
最高温度31℃ |
最低温度24℃ |
夜间晴 |
0% |
东南风 |
1级 |
空气质量优 |
9 |
星期四 |
08月08日 |
白天小雨 |
85% |
最高温度29℃ |
最低温度24℃ |
夜间多云 |
0% |
东北风 |
1级 |
空气质量优 |
10 |
星期五 |
08月09日 |
白天小雨 |
85% |
最高温度29℃ |
最低温度24℃ |
夜间阴 |
0% |
东北风 |
1级 |
空气质量优 |
11 |
星期五 |
08月09日 |
白天小雨 |
85% |
最高温度29℃ |
最低温度24℃ |
夜间阴 |
0% |
东北风 |
1级 |
空气质量优 |
数据的排序和排名
df = pd.read_excel("测试数据.xlsx", sheet_name="天气")
# 按列排序升序
df.sort_values(by="3级")
# 按列排序降序
df.sort_values(by="3级",ascending=False)
# 多列排序
df.sort_values(by=["3级", "最高温度34℃"], ascending=False)
|
昨天 |
07月25日 |
白天阴 |
0% |
最高温度34℃ |
最低温度27℃ |
夜间小雨 |
85% |
南风 |
3级 |
空气质量优 |
3 |
星期一 |
07月29日 |
白天小雨 |
80% |
最高温度34℃ |
最低温度27℃ |
夜间小雨 |
85% |
南风 |
3级 |
空气质量优 |
2 |
星期日 |
07月28日 |
NaN |
0% |
最高温度33℃ |
最低温度27℃ |
夜间阴 |
0% |
南风 |
3级 |
空气质量优 |
16 |
星期日 |
07月28日 |
NaN |
0% |
最高温度33℃ |
最低温度27℃ |
夜间阴 |
0% |
南风 |
3级 |
空气质量优 |
4 |
星期二 |
07月30日 |
白天小雨 |
85% |
最高温度32℃ |
最低温度25℃ |
夜间中雨 |
90% |
西风 |
3级 |
空气质量优 |
1 |
星期六 |
07月27日 |
白天小雨 |
80% |
最高温度31℃ |
最低温度27℃ |
夜间小雨 |
85% |
东南风 |
3级 |
空气质量优 |
6 |
星期四 |
08月01日 |
白天中雨 |
90% |
最高温度33℃ |
最低温度25℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
0 |
今天 |
07月26日 |
白天小雨 |
85% |
最高温度32℃ |
最低温度26℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
5 |
星期三 |
07月31日 |
白天小雨 |
NaN |
最高温度31℃ |
最低温度26℃ |
夜间小雨 |
NaN |
东南风 |
1级 |
空气质量优 |
7 |
星期五 |
08月02日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度25℃ |
夜间小雨 |
85% |
西南风 |
1级 |
NaN |
9 |
星期日 |
08月04日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度26℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
10 |
星期一 |
08月05日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度25℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
12 |
星期三 |
08月07日 |
白天多云 |
0% |
最高温度31℃ |
最低温度24℃ |
夜间晴 |
0% |
东南风 |
1级 |
空气质量优 |
8 |
星期六 |
08月03日 |
白天小雨 |
85% |
最高温度30℃ |
最低温度26℃ |
夜间晴 |
0% |
南风 |
1级 |
空气质量优 |
13 |
星期四 |
08月08日 |
白天小雨 |
85% |
最高温度29℃ |
最低温度24℃ |
夜间多云 |
0% |
东北风 |
1级 |
空气质量优 |
14 |
星期五 |
08月09日 |
白天小雨 |
85% |
最高温度29℃ |
最低温度24℃ |
夜间阴 |
0% |
东北风 |
1级 |
空气质量优 |
15 |
星期五 |
08月09日 |
白天小雨 |
85% |
最高温度29℃ |
最低温度24℃ |
夜间阴 |
0% |
东北风 |
1级 |
空气质量优 |
11 |
星期二 |
08月06日 |
白天小雨 |
85% |
NaN |
最低温度26℃ |
夜间阴 |
0% |
东南风 |
1级 |
空气质量优 |
# 数据排名
df = pd.read_excel("测试数据.xlsx", sheet_name="天气")
df = df.sort_values(["3级"],ascending=False)
df['排名']=df["3级"].rank(ascending=False)
df
|
昨天 |
07月25日 |
白天阴 |
0% |
最高温度34℃ |
最低温度27℃ |
夜间小雨 |
85% |
南风 |
3级 |
空气质量优 |
排名 |
16 |
星期日 |
07月28日 |
NaN |
0% |
最高温度33℃ |
最低温度27℃ |
夜间阴 |
0% |
南风 |
3级 |
空气质量优 |
3.0 |
2 |
星期日 |
07月28日 |
NaN |
0% |
最高温度33℃ |
最低温度27℃ |
夜间阴 |
0% |
南风 |
3级 |
空气质量优 |
3.0 |
3 |
星期一 |
07月29日 |
白天小雨 |
80% |
最高温度34℃ |
最低温度27℃ |
夜间小雨 |
85% |
南风 |
3级 |
空气质量优 |
3.0 |
4 |
星期二 |
07月30日 |
白天小雨 |
85% |
最高温度32℃ |
最低温度25℃ |
夜间中雨 |
90% |
西风 |
3级 |
空气质量优 |
3.0 |
1 |
星期六 |
07月27日 |
白天小雨 |
80% |
最高温度31℃ |
最低温度27℃ |
夜间小雨 |
85% |
东南风 |
3级 |
空气质量优 |
3.0 |
11 |
星期二 |
08月06日 |
白天小雨 |
85% |
NaN |
最低温度26℃ |
夜间阴 |
0% |
东南风 |
1级 |
空气质量优 |
11.5 |
15 |
星期五 |
08月09日 |
白天小雨 |
85% |
最高温度29℃ |
最低温度24℃ |
夜间阴 |
0% |
东北风 |
1级 |
空气质量优 |
11.5 |
14 |
星期五 |
08月09日 |
白天小雨 |
85% |
最高温度29℃ |
最低温度24℃ |
夜间阴 |
0% |
东北风 |
1级 |
空气质量优 |
11.5 |
13 |
星期四 |
08月08日 |
白天小雨 |
85% |
最高温度29℃ |
最低温度24℃ |
夜间多云 |
0% |
东北风 |
1级 |
空气质量优 |
11.5 |
12 |
星期三 |
08月07日 |
白天多云 |
0% |
最高温度31℃ |
最低温度24℃ |
夜间晴 |
0% |
东南风 |
1级 |
空气质量优 |
11.5 |
0 |
今天 |
07月26日 |
白天小雨 |
85% |
最高温度32℃ |
最低温度26℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
11.5 |
10 |
星期一 |
08月05日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度25℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
11.5 |
9 |
星期日 |
08月04日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度26℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
11.5 |
7 |
星期五 |
08月02日 |
白天小雨 |
85% |
最高温度31℃ |
最低温度25℃ |
夜间小雨 |
85% |
西南风 |
1级 |
NaN |
11.5 |
6 |
星期四 |
08月01日 |
白天中雨 |
90% |
最高温度33℃ |
最低温度25℃ |
夜间小雨 |
85% |
东南风 |
1级 |
空气质量优 |
11.5 |
5 |
星期三 |
07月31日 |
白天小雨 |
NaN |
最高温度31℃ |
最低温度26℃ |
夜间小雨 |
NaN |
东南风 |
1级 |
空气质量优 |
11.5 |
8 |
星期六 |
08月03日 |
白天小雨 |
85% |
最高温度30℃ |
最低温度26℃ |
夜间晴 |
0% |
南风 |
1级 |
空气质量优 |
11.5 |
数据的计算
求和
import pandas as pd
df = pd.read_excel("测试数据.xlsx", sheet_name="成绩表",index_col=0)
df
|
语文 |
数学 |
英语 |
姓名 |
|
|
|
朱楠 |
85 |
11 |
90 |
李鹏 |
0 |
69 |
68 |
党杰 |
3 |
44 |
94 |
王洁 |
92 |
73 |
8 |
韩健 |
86 |
93 |
72 |
范晶 |
26 |
16 |
9 |
张娜 |
36 |
45 |
5 |
林建 |
81 |
64 |
72 |
李秀荣 |
32 |
85 |
37 |
雷桂芝 |
29 |
26 |
87 |
df['总成绩']=df.sum(axis=1)
df
|
语文 |
数学 |
英语 |
总成绩 |
姓名 |
|
|
|
|
朱楠 |
85 |
11 |
90 |
186 |
李鹏 |
0 |
69 |
68 |
137 |
党杰 |
3 |
44 |
94 |
141 |
王洁 |
92 |
73 |
8 |
173 |
韩健 |
86 |
93 |
72 |
251 |
范晶 |
26 |
16 |
9 |
51 |
张娜 |
36 |
45 |
5 |
86 |
林建 |
81 |
64 |
72 |
217 |
李秀荣 |
32 |
85 |
37 |
154 |
雷桂芝 |
29 |
26 |
87 |
142 |
pd.concat([df, df.sum(axis=0).to_frame('各科总成绩').T],axis=0)
|
语文 |
数学 |
英语 |
总成绩 |
朱楠 |
85 |
11 |
90 |
186 |
李鹏 |
0 |
69 |
68 |
137 |
党杰 |
3 |
44 |
94 |
141 |
王洁 |
92 |
73 |
8 |
173 |
韩健 |
86 |
93 |
72 |
251 |
范晶 |
26 |
16 |
9 |
51 |
张娜 |
36 |
45 |
5 |
86 |
林建 |
81 |
64 |
72 |
217 |
李秀荣 |
32 |
85 |
37 |
154 |
雷桂芝 |
29 |
26 |
87 |
142 |
各科总成绩 |
470 |
526 |
542 |
1538 |
计算平均值
import pandas as pd
df = pd.read_excel("测试数据.xlsx", sheet_name="成绩表", index_col=0)
df
|
语文 |
数学 |
英语 |
姓名 |
|
|
|
朱楠 |
85 |
11 |
90 |
李鹏 |
0 |
69 |
68 |
党杰 |
3 |
44 |
94 |
王洁 |
92 |
73 |
8 |
韩健 |
86 |
93 |
72 |
范晶 |
26 |
16 |
9 |
张娜 |
36 |
45 |
5 |
林建 |
81 |
64 |
72 |
李秀荣 |
32 |
85 |
37 |
雷桂芝 |
29 |
26 |
87 |
pd.concat([df,df.mean().to_frame(name='各科平均值').T])
|
语文 |
数学 |
英语 |
朱楠 |
85.0 |
11.0 |
90.0 |
李鹏 |
0.0 |
69.0 |
68.0 |
党杰 |
3.0 |
44.0 |
94.0 |
王洁 |
92.0 |
73.0 |
8.0 |
韩健 |
86.0 |
93.0 |
72.0 |
范晶 |
26.0 |
16.0 |
9.0 |
张娜 |
36.0 |
45.0 |
5.0 |
林建 |
81.0 |
64.0 |
72.0 |
李秀荣 |
32.0 |
85.0 |
37.0 |
雷桂芝 |
29.0 |
26.0 |
87.0 |
各科平均值 |
47.0 |
52.6 |
54.2 |
最大值和最小值
df.max()
语文 92
数学 93
英语 94
dtype: int64
df.min()
语文 0
数学 11
英语 5
dtype: int64
数据格式化
import pandas as pd
df = pd.read_excel("测试数据.xlsx", sheet_name="小数数据")
df
|
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
0 |
0.271921 |
0.996787 |
0.471560 |
0.249732 |
0.720678 |
0.453268 |
0.825131 |
0.093008 |
0.596691 |
0.954758 |
1 |
0.939883 |
0.215622 |
0.697735 |
0.261365 |
0.459877 |
0.230398 |
0.281006 |
0.510921 |
0.014184 |
0.601618 |
2 |
0.224412 |
0.636169 |
0.092120 |
0.276540 |
0.477949 |
0.840925 |
0.919196 |
0.059619 |
0.723866 |
0.683743 |
3 |
0.822699 |
0.508127 |
0.472934 |
0.969832 |
0.021230 |
0.905248 |
0.108958 |
0.695111 |
0.210165 |
0.566734 |
4 |
0.268033 |
0.974901 |
0.464375 |
0.162012 |
0.183204 |
0.855472 |
0.416701 |
0.857291 |
0.557196 |
0.632627 |
5 |
0.639998 |
0.260999 |
0.748257 |
0.692781 |
0.184112 |
0.692853 |
0.033808 |
0.113456 |
0.899956 |
0.382173 |
6 |
0.983553 |
0.656237 |
0.920638 |
0.670398 |
0.296118 |
0.276094 |
0.973147 |
0.461183 |
0.136607 |
0.634519 |
7 |
0.789665 |
0.412802 |
0.610604 |
0.146851 |
0.473035 |
0.803915 |
0.563969 |
0.876063 |
0.728956 |
0.140347 |
8 |
0.065738 |
0.912120 |
0.835372 |
0.728623 |
0.150974 |
0.698806 |
0.715707 |
0.100839 |
0.635582 |
0.474571 |
9 |
0.185891 |
0.971247 |
0.800855 |
0.536999 |
0.859812 |
0.247202 |
0.671131 |
0.402803 |
0.623624 |
0.865891 |
设置小数位置
# 对所有列保留指定小数
df.round(2)
|
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
0 |
0.27 |
1.00 |
0.47 |
0.25 |
0.72 |
0.45 |
0.83 |
0.09 |
0.60 |
0.95 |
1 |
0.94 |
0.22 |
0.70 |
0.26 |
0.46 |
0.23 |
0.28 |
0.51 |
0.01 |
0.60 |
2 |
0.22 |
0.64 |
0.09 |
0.28 |
0.48 |
0.84 |
0.92 |
0.06 |
0.72 |
0.68 |
3 |
0.82 |
0.51 |
0.47 |
0.97 |
0.02 |
0.91 |
0.11 |
0.70 |
0.21 |
0.57 |
4 |
0.27 |
0.97 |
0.46 |
0.16 |
0.18 |
0.86 |
0.42 |
0.86 |
0.56 |
0.63 |
5 |
0.64 |
0.26 |
0.75 |
0.69 |
0.18 |
0.69 |
0.03 |
0.11 |
0.90 |
0.38 |
6 |
0.98 |
0.66 |
0.92 |
0.67 |
0.30 |
0.28 |
0.97 |
0.46 |
0.14 |
0.63 |
7 |
0.79 |
0.41 |
0.61 |
0.15 |
0.47 |
0.80 |
0.56 |
0.88 |
0.73 |
0.14 |
8 |
0.07 |
0.91 |
0.84 |
0.73 |
0.15 |
0.70 |
0.72 |
0.10 |
0.64 |
0.47 |
9 |
0.19 |
0.97 |
0.80 |
0.54 |
0.86 |
0.25 |
0.67 |
0.40 |
0.62 |
0.87 |
# 对指定列保留指定小数
df.round({'a': 2, 'b': 1})
# Series
s = pd.Series(data=[1,2,0,1],index=['a','b','c','d'])
df.round(s)
|
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
0 |
0.271921 |
0.996787 |
0.471560 |
0.249732 |
0.720678 |
0.453268 |
0.825131 |
0.093008 |
0.596691 |
0.954758 |
1 |
0.939883 |
0.215622 |
0.697735 |
0.261365 |
0.459877 |
0.230398 |
0.281006 |
0.510921 |
0.014184 |
0.601618 |
2 |
0.224412 |
0.636169 |
0.092120 |
0.276540 |
0.477949 |
0.840925 |
0.919196 |
0.059619 |
0.723866 |
0.683743 |
3 |
0.822699 |
0.508127 |
0.472934 |
0.969832 |
0.021230 |
0.905248 |
0.108958 |
0.695111 |
0.210165 |
0.566734 |
4 |
0.268033 |
0.974901 |
0.464375 |
0.162012 |
0.183204 |
0.855472 |
0.416701 |
0.857291 |
0.557196 |
0.632627 |
5 |
0.639998 |
0.260999 |
0.748257 |
0.692781 |
0.184112 |
0.692853 |
0.033808 |
0.113456 |
0.899956 |
0.382173 |
6 |
0.983553 |
0.656237 |
0.920638 |
0.670398 |
0.296118 |
0.276094 |
0.973147 |
0.461183 |
0.136607 |
0.634519 |
7 |
0.789665 |
0.412802 |
0.610604 |
0.146851 |
0.473035 |
0.803915 |
0.563969 |
0.876063 |
0.728956 |
0.140347 |
8 |
0.065738 |
0.912120 |
0.835372 |
0.728623 |
0.150974 |
0.698806 |
0.715707 |
0.100839 |
0.635582 |
0.474571 |
9 |
0.185891 |
0.971247 |
0.800855 |
0.536999 |
0.859812 |
0.247202 |
0.671131 |
0.402803 |
0.623624 |
0.865891 |
df.map(lambda x: "{:.2f}".format(x))
|
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
0 |
0.27 |
1.00 |
0.47 |
0.25 |
0.72 |
0.45 |
0.83 |
0.09 |
0.60 |
0.95 |
1 |
0.94 |
0.22 |
0.70 |
0.26 |
0.46 |
0.23 |
0.28 |
0.51 |
0.01 |
0.60 |
2 |
0.22 |
0.64 |
0.09 |
0.28 |
0.48 |
0.84 |
0.92 |
0.06 |
0.72 |
0.68 |
3 |
0.82 |
0.51 |
0.47 |
0.97 |
0.02 |
0.91 |
0.11 |
0.70 |
0.21 |
0.57 |
4 |
0.27 |
0.97 |
0.46 |
0.16 |
0.18 |
0.86 |
0.42 |
0.86 |
0.56 |
0.63 |
5 |
0.64 |
0.26 |
0.75 |
0.69 |
0.18 |
0.69 |
0.03 |
0.11 |
0.90 |
0.38 |
6 |
0.98 |
0.66 |
0.92 |
0.67 |
0.30 |
0.28 |
0.97 |
0.46 |
0.14 |
0.63 |
7 |
0.79 |
0.41 |
0.61 |
0.15 |
0.47 |
0.80 |
0.56 |
0.88 |
0.73 |
0.14 |
8 |
0.07 |
0.91 |
0.84 |
0.73 |
0.15 |
0.70 |
0.72 |
0.10 |
0.64 |
0.47 |
9 |
0.19 |
0.97 |
0.80 |
0.54 |
0.86 |
0.25 |
0.67 |
0.40 |
0.62 |
0.87 |
设置百分比
import pandas as pd
# df = pd.read_csv("格式化.csv", names=list("abcdefghij"))
df = pd.read_excel("测试数据.xlsx", sheet_name="小数数据")
df
|
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
0 |
0.271921 |
0.996787 |
0.471560 |
0.249732 |
0.720678 |
0.453268 |
0.825131 |
0.093008 |
0.596691 |
0.954758 |
1 |
0.939883 |
0.215622 |
0.697735 |
0.261365 |
0.459877 |
0.230398 |
0.281006 |
0.510921 |
0.014184 |
0.601618 |
2 |
0.224412 |
0.636169 |
0.092120 |
0.276540 |
0.477949 |
0.840925 |
0.919196 |
0.059619 |
0.723866 |
0.683743 |
3 |
0.822699 |
0.508127 |
0.472934 |
0.969832 |
0.021230 |
0.905248 |
0.108958 |
0.695111 |
0.210165 |
0.566734 |
4 |
0.268033 |
0.974901 |
0.464375 |
0.162012 |
0.183204 |
0.855472 |
0.416701 |
0.857291 |
0.557196 |
0.632627 |
5 |
0.639998 |
0.260999 |
0.748257 |
0.692781 |
0.184112 |
0.692853 |
0.033808 |
0.113456 |
0.899956 |
0.382173 |
6 |
0.983553 |
0.656237 |
0.920638 |
0.670398 |
0.296118 |
0.276094 |
0.973147 |
0.461183 |
0.136607 |
0.634519 |
7 |
0.789665 |
0.412802 |
0.610604 |
0.146851 |
0.473035 |
0.803915 |
0.563969 |
0.876063 |
0.728956 |
0.140347 |
8 |
0.065738 |
0.912120 |
0.835372 |
0.728623 |
0.150974 |
0.698806 |
0.715707 |
0.100839 |
0.635582 |
0.474571 |
9 |
0.185891 |
0.971247 |
0.800855 |
0.536999 |
0.859812 |
0.247202 |
0.671131 |
0.402803 |
0.623624 |
0.865891 |
df['B'].apply(lambda x: format(x, '.2%'))
df["B"].map(lambda x: format(x, ".0%"))
0 100%
1 22%
2 64%
3 51%
4 97%
5 26%
6 66%
7 41%
8 91%
9 97%
Name: B, dtype: object
设置千分比
import pandas as pd
df = pd.read_excel("测试数据.xlsx", sheet_name="小数数据")
df
|
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
0 |
0.271921 |
0.996787 |
0.471560 |
0.249732 |
0.720678 |
0.453268 |
0.825131 |
0.093008 |
0.596691 |
0.954758 |
1 |
0.939883 |
0.215622 |
0.697735 |
0.261365 |
0.459877 |
0.230398 |
0.281006 |
0.510921 |
0.014184 |
0.601618 |
2 |
0.224412 |
0.636169 |
0.092120 |
0.276540 |
0.477949 |
0.840925 |
0.919196 |
0.059619 |
0.723866 |
0.683743 |
3 |
0.822699 |
0.508127 |
0.472934 |
0.969832 |
0.021230 |
0.905248 |
0.108958 |
0.695111 |
0.210165 |
0.566734 |
4 |
0.268033 |
0.974901 |
0.464375 |
0.162012 |
0.183204 |
0.855472 |
0.416701 |
0.857291 |
0.557196 |
0.632627 |
5 |
0.639998 |
0.260999 |
0.748257 |
0.692781 |
0.184112 |
0.692853 |
0.033808 |
0.113456 |
0.899956 |
0.382173 |
6 |
0.983553 |
0.656237 |
0.920638 |
0.670398 |
0.296118 |
0.276094 |
0.973147 |
0.461183 |
0.136607 |
0.634519 |
7 |
0.789665 |
0.412802 |
0.610604 |
0.146851 |
0.473035 |
0.803915 |
0.563969 |
0.876063 |
0.728956 |
0.140347 |
8 |
0.065738 |
0.912120 |
0.835372 |
0.728623 |
0.150974 |
0.698806 |
0.715707 |
0.100839 |
0.635582 |
0.474571 |
9 |
0.185891 |
0.971247 |
0.800855 |
0.536999 |
0.859812 |
0.247202 |
0.671131 |
0.402803 |
0.623624 |
0.865891 |
df['A'].apply(lambda x:format(int(x*100000),','))
0 27,192
1 93,988
2 22,441
3 82,269
4 26,803
5 63,999
6 98,355
7 78,966
8 6,573
9 18,589
Name: A, dtype: object
applay、applymap、map的区别
- apply
- apply 方法是 DataFrame 和 Series 对象的一个方法。
- 它允许你对数据集中的行或列应用一个函数。
- 默认情况下,apply 在 DataFrame 上沿着轴向操作,这意味着它可以分别对每一列(默认)或每一行(通过设置 axis=1)应用函数。
- 你可以传递一个函数给 apply,这个函数可以返回一个标量值、Series 或 DataFrame。
import pandas as pd
df = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
# 对每一列应用一个函数,例如计算平方
df_squared = df.apply(lambda x: x**2)
print(df_squared)
s = pd.Series([1, 2, 3, 4, 5],index=['a', 'b', 'c', 'd', 'e'])
s.apply(lambda x: x**2)
A B
0 1 9
1 4 16
a 1
b 4
c 9
d 16
e 25
dtype: int64
- applymap
- applymap 方法是 DataFrame 对象的一个方法。
- 它用于对 DataFrame 中的每个元素应用一个函数。
- applymap 总是作用于整个数据框的每个元素,没有 axis 参数。
- 被弃用,被map函数取代。
df = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
df.map(lambda x: x + 10)
- map
- map 是 Series 对象的一个方法,用于对 Series 中的每个元素应用一个函数。
- 它通常用于将 Series 中的每个值映射到另一个值。
- map 通常用于字典、 Series、字典作为参数,用于转换值。
s = pd.Series([1, 2, 3, 4, 5], index=["a", "b", "c", "d", "e"])
print("-" * 20 + "Series+函数" + "-" * 20)
print(s.map(lambda x: x + 1))
print("-" * 20 + "DataFrame+函数" + "-" * 20)
df = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
print(df.map(lambda x: x + 1))
print("-" * 20 + "DataFrame+字典" + "-" * 20)
df = pd.DataFrame({"A": [1, 2], "B": [3, 4],'C':['男','女']})
print(df['C'].map({'男':0,'女':1}))
--------------------Series+函数--------------------
a 2
b 3
c 4
d 5
e 6
dtype: int64
--------------------DataFrame+函数--------------------
A B
0 2 4
1 3 5
--------------------DataFrame+字典--------------------
0 0
1 1
Name: C, dtype: int64
数据分组统计
import pandas as pd
df = pd.read_excel("测试数据.xlsx", sheet_name="产品销售表")
# df.set_index('姓名',inplace=True)
# 按照单列进行分组
print(df[["产品", "数量", "单价"]].groupby("产品").sum())
数量 单价
产品
CPU 448 11639
DVD 452 10977
发电机 465 8947
显示器 437 9160
键盘 255 7712
鼠标 271 6390
# 按照多列进行分组
print(df[["产品", "数量", "销售员"]].groupby(["产品", "销售员"]).sum())
数量
产品 销售员
CPU 李文 137
李桂花 31
李玉梅 94
王杨 72
陈玉梅 114
DVD 李文 53
李桂花 33
李玉梅 92
王杨 70
陈玉梅 204
发电机 李文 148
李桂花 109
李玉梅 20
王杨 117
陈玉梅 71
显示器 李文 82
李桂花 63
李玉梅 84
王杨 63
陈玉梅 145
键盘 李文 60
李桂花 60
李玉梅 30
王杨 10
陈玉梅 95
鼠标 李文 94
李桂花 20
李玉梅 63
王杨 41
陈玉梅 53
# 分组并按指定列计算
df[["产品", "数量", "单价"]].groupby('产品')['数量'].sum()
产品
CPU 448
DVD 452
发电机 465
显示器 437
键盘 255
鼠标 271
Name: 数量, dtype: int64
# 遍历单列分组
for name,group in df[["产品", "数量", "单价"]].groupby("产品"):
print(name,group)
CPU 产品 数量 单价
10 CPU 31 378
32 CPU 20 930
36 CPU 33 380
44 CPU 31 989
46 CPU 20 272
48 CPU 31 695
61 CPU 33 619
63 CPU 31 701
67 CPU 20 908
70 CPU 31 148
71 CPU 20 965
72 CPU 10 441
77 CPU 10 831
83 CPU 31 862
84 CPU 20 304
88 CPU 10 962
90 CPU 33 580
92 CPU 33 674
DVD 产品 数量 单价
0 DVD 33 705
2 DVD 31 420
4 DVD 33 214
5 DVD 33 646
12 DVD 20 506
16 DVD 10 129
27 DVD 20 700
33 DVD 33 911
39 DVD 31 337
52 DVD 33 365
54 DVD 10 931
56 DVD 10 440
59 DVD 20 919
66 DVD 33 846
75 DVD 31 507
81 DVD 20 451
82 DVD 31 892
93 DVD 10 868
94 DVD 10 190
发电机 产品 数量 单价
6 发电机 10 414
7 发电机 33 395
13 发电机 31 316
15 发电机 20 247
21 发电机 10 561
24 发电机 20 350
28 发电机 33 409
29 发电机 33 906
31 发电机 33 828
40 发电机 20 352
47 发电机 20 679
57 发电机 33 323
58 发电机 31 890
68 发电机 10 324
89 发电机 31 552
96 发电机 31 631
97 发电机 33 565
98 发电机 33 205
显示器 产品 数量 单价
1 显示器 10 905
8 显示器 31 258
14 显示器 10 834
18 显示器 31 362
23 显示器 20 902
34 显示器 33 690
35 显示器 20 272
38 显示器 33 363
42 显示器 31 617
50 显示器 20 578
51 显示器 20 147
62 显示器 20 134
65 显示器 10 470
76 显示器 33 118
78 显示器 20 900
85 显示器 31 569
87 显示器 31 131
95 显示器 33 910
键盘 产品 数量 单价
9 键盘 10 497
17 键盘 10 798
19 键盘 10 606
20 键盘 10 761
22 键盘 20 980
25 键盘 10 518
41 键盘 20 325
43 键盘 10 859
45 键盘 31 588
53 键盘 20 259
69 键盘 33 356
73 键盘 31 358
86 键盘 20 617
91 键盘 20 190
鼠标 产品 数量 单价
3 鼠标 10 526
11 鼠标 20 608
26 鼠标 10 107
30 鼠标 33 754
37 鼠标 20 195
49 鼠标 31 403
55 鼠标 20 671
60 鼠标 31 551
64 鼠标 10 804
74 鼠标 33 434
79 鼠标 10 991
80 鼠标 10 110
99 鼠标 33 236
# 遍历多列分组
df1 = df[["产品", "数量", "销售员"]].groupby(["产品", "销售员"])
for (k1,k2), group in df1:
print(k1,k2,group)
CPU 李文 产品 数量 销售员
32 CPU 20 李文
36 CPU 33 李文
71 CPU 20 李文
83 CPU 31 李文
92 CPU 33 李文
CPU 李桂花 产品 数量 销售员
63 CPU 31 李桂花
CPU 李玉梅 产品 数量 销售员
44 CPU 31 李玉梅
61 CPU 33 李玉梅
67 CPU 20 李玉梅
88 CPU 10 李玉梅
CPU 王杨 产品 数量 销售员
48 CPU 31 王杨
70 CPU 31 王杨
72 CPU 10 王杨
CPU 陈玉梅 产品 数量 销售员
10 CPU 31 陈玉梅
46 CPU 20 陈玉梅
77 CPU 10 陈玉梅
84 CPU 20 陈玉梅
90 CPU 33 陈玉梅
DVD 李文 产品 数量 销售员
12 DVD 20 李文
52 DVD 33 李文
DVD 李桂花 产品 数量 销售员
0 DVD 33 李桂花
DVD 李玉梅 产品 数量 销售员
27 DVD 20 李玉梅
39 DVD 31 李玉梅
56 DVD 10 李玉梅
82 DVD 31 李玉梅
DVD 王杨 产品 数量 销售员
16 DVD 10 王杨
54 DVD 10 王杨
59 DVD 20 王杨
81 DVD 20 王杨
93 DVD 10 王杨
DVD 陈玉梅 产品 数量 销售员
2 DVD 31 陈玉梅
4 DVD 33 陈玉梅
5 DVD 33 陈玉梅
33 DVD 33 陈玉梅
66 DVD 33 陈玉梅
75 DVD 31 陈玉梅
94 DVD 10 陈玉梅
发电机 李文 产品 数量 销售员
6 发电机 10 李文
7 发电机 33 李文
68 发电机 10 李文
89 发电机 31 李文
96 发电机 31 李文
98 发电机 33 李文
发电机 李桂花 产品 数量 销售员
21 发电机 10 李桂花
28 发电机 33 李桂花
31 发电机 33 李桂花
97 发电机 33 李桂花
发电机 李玉梅 产品 数量 销售员
40 发电机 20 李玉梅
发电机 王杨 产品 数量 销售员
13 发电机 31 王杨
15 发电机 20 王杨
29 发电机 33 王杨
57 发电机 33 王杨
发电机 陈玉梅 产品 数量 销售员
24 发电机 20 陈玉梅
47 发电机 20 陈玉梅
58 发电机 31 陈玉梅
显示器 李文 产品 数量 销售员
18 显示器 31 李文
51 显示器 20 李文
87 显示器 31 李文
显示器 李桂花 产品 数量 销售员
1 显示器 10 李桂花
38 显示器 33 李桂花
62 显示器 20 李桂花
显示器 李玉梅 产品 数量 销售员
42 显示器 31 李玉梅
50 显示器 20 李玉梅
95 显示器 33 李玉梅
显示器 王杨 产品 数量 销售员
23 显示器 20 王杨
34 显示器 33 王杨
65 显示器 10 王杨
显示器 陈玉梅 产品 数量 销售员
8 显示器 31 陈玉梅
14 显示器 10 陈玉梅
35 显示器 20 陈玉梅
76 显示器 33 陈玉梅
78 显示器 20 陈玉梅
85 显示器 31 陈玉梅
键盘 李文 产品 数量 销售员
9 键盘 10 李文
17 键盘 10 李文
22 键盘 20 李文
41 键盘 20 李文
键盘 李桂花 产品 数量 销售员
19 键盘 10 李桂花
20 键盘 10 李桂花
53 键盘 20 李桂花
91 键盘 20 李桂花
键盘 李玉梅 产品 数量 销售员
25 键盘 10 李玉梅
86 键盘 20 李玉梅
键盘 王杨 产品 数量 销售员
43 键盘 10 王杨
键盘 陈玉梅 产品 数量 销售员
45 键盘 31 陈玉梅
69 键盘 33 陈玉梅
73 键盘 31 陈玉梅
鼠标 李文 产品 数量 销售员
49 鼠标 31 李文
55 鼠标 20 李文
80 鼠标 10 李文
99 鼠标 33 李文
鼠标 李桂花 产品 数量 销售员
37 鼠标 20 李桂花
鼠标 李玉梅 产品 数量 销售员
3 鼠标 10 李玉梅
26 鼠标 10 李玉梅
74 鼠标 33 李玉梅
79 鼠标 10 李玉梅
鼠标 王杨 产品 数量 销售员
60 鼠标 31 王杨
64 鼠标 10 王杨
鼠标 陈玉梅 产品 数量 销售员
11 鼠标 20 陈玉梅
30 鼠标 33 陈玉梅
# 对分组进行聚合并指定单列的多个计算函数
df1 = df[["产品", "数量",'单价']]
df1.groupby("产品")['数量'].agg(['sum','mean'])
|
sum |
mean |
产品 |
|
|
CPU |
448 |
24.888889 |
DVD |
452 |
23.789474 |
发电机 |
465 |
25.833333 |
显示器 |
437 |
24.277778 |
键盘 |
255 |
18.214286 |
鼠标 |
271 |
20.846154 |
# 对分组进行聚合并指定多列的多个计算函数
df1 = df[["产品", "数量", "单价"]]
df1.groupby("产品").agg({'数量':['sum','mean'],'单价':['max','max']})
|
数量 |
单价 |
|
sum |
mean |
max |
max |
产品 |
|
|
|
|
CPU |
448 |
24.888889 |
989 |
989 |
DVD |
452 |
23.789474 |
931 |
931 |
发电机 |
465 |
25.833333 |
906 |
906 |
显示器 |
437 |
24.277778 |
910 |
910 |
键盘 |
255 |
18.214286 |
980 |
980 |
鼠标 |
271 |
20.846154 |
991 |
991 |
# 自定义函数进行分组统计
df['产品'].value_counts()# 统计每个产品出现的次数
maxcount = lambda x: x.value_counts().iloc[0]
maxcount.__name__ = '库存最多的产品'
df1=df.agg({'产品':[maxcount],'数量':['sum']})
df1
|
产品 |
数量 |
库存最多的产品 |
19.0 |
NaN |
sum |
NaN |
2328.0 |
import pandas as pd
df = pd.read_excel("测试数据.xlsx", sheet_name="地区销售表")
dic = {"北京":'华北地区',
"哈尔滨":'东北地区',
"广州":'华南地区',
"深圳":'华南地区',
"杭州":'华东地区',
"沈阳":'东北地区',
}
df = df.set_index("商品名称")
df.T.groupby(dic).sum() #axis=1表示按列分组
商品名称 |
鼠标 |
键盘 |
DVD |
显示器 |
发电机 |
CPU |
东北地区 |
135 |
112 |
71 |
60 |
187 |
138 |
华东地区 |
31 |
31 |
4 |
32 |
97 |
24 |
华北地区 |
48 |
78 |
10 |
36 |
100 |
20 |
华南地区 |
41 |
54 |
73 |
140 |
182 |
93 |
import pandas as pd
df = pd.read_excel("测试数据.xlsx", sheet_name="地区销售表")
dic = {
"北京": "华北地区",
"哈尔滨": "东北地区",
"广州": "华南地区",
"深圳": "华南地区",
"杭州": "华东地区",
"沈阳": "东北地区",
}
df = df.set_index("商品名称")
s = pd.Series(dic)
df.T.groupby(s).sum()
商品名称 |
鼠标 |
键盘 |
DVD |
显示器 |
发电机 |
CPU |
东北地区 |
135 |
112 |
71 |
60 |
187 |
138 |
华东地区 |
31 |
31 |
4 |
32 |
97 |
24 |
华北地区 |
48 |
78 |
10 |
36 |
100 |
20 |
华南地区 |
41 |
54 |
73 |
140 |
182 |
93 |
数据移位
import pandas as pd
data = [3453,8345,3423,8753,3123]
index=[ i for i in range(1,len(data)+1)]
df = pd.DataFrame(data,index=index,columns=['OPPO'])
print(df)
df['销量差'] = df['OPPO'] - df['OPPO'].shift()
print(df["OPPO"].shift())
df
OPPO
1 3453
2 8345
3 3423
4 8753
5 3123
1 NaN
2 3453.0
3 8345.0
4 3423.0
5 8753.0
Name: OPPO, dtype: float64
|
OPPO |
销量差 |
1 |
3453 |
NaN |
2 |
8345 |
4892.0 |
3 |
3423 |
-4922.0 |
4 |
8753 |
5330.0 |
5 |
3123 |
-5630.0 |
数据转换
import pandas as pd
df = pd.read_excel("测试数据.xlsx", sheet_name="发货单表")
df.head()
|
客户名称 |
联系电话 |
快递地址 |
0 |
王兵 |
15147000967 |
山西省 通辽 霍路X座 |
1 |
吴健 |
13762072887 |
湖南省 海门 尚路K座 |
2 |
冯琳 |
15562303487 |
台湾省 澳门 叶路f座 |
3 |
胡岩 |
18844855983 |
上海市 合山 银川路B座 |
4 |
张兰英 |
13165766513 |
内蒙古自治区 六安 乌鲁木齐路B座 |
# 分割快递地址列
df1 = df['快递地址'].str.split(' ',expand=True)
df1.columns = ['省','市','街道']
df1
|
省 |
市 |
街道 |
0 |
山西省 |
通辽 |
霍路X座 |
1 |
湖南省 |
海门 |
尚路K座 |
2 |
台湾省 |
澳门 |
叶路f座 |
3 |
上海市 |
合山 |
银川路B座 |
4 |
内蒙古自治区 |
六安 |
乌鲁木齐路B座 |
... |
... |
... |
... |
95 |
香港特别行政区 |
六安 |
朱街w座 |
96 |
江苏省 |
上海 |
朱路z座 |
97 |
黑龙江省 |
上海 |
福州街a座 |
98 |
澳门特别行政区 |
海门 |
上海路P座 |
99 |
辽宁省 |
沈阳 |
佛山街A座 |
100 rows × 3 columns
# 分割元组列
import pandas as pd
dic = {
'col1': [1, 2],
'col2': [('a','b','c'), ('d','e','f')]
}
df = pd.DataFrame(dic)
df[['col2_1','col2_2','col2_3']]= df['col2'].apply(pd.Series)
df
|
col1 |
col2 |
col2_1 |
col2_2 |
col2_3 |
0 |
1 |
(a, b, c) |
a |
b |
c |
1 |
2 |
(d, e, f) |
d |
e |
f |
import pandas as pd
dic = {"col1": [1, 2], "col2": [("a", "b", "c"), ("d", "e", "f")]}
df = pd.DataFrame(dic)
df.join(df['col2'].apply(pd.Series))
|
col1 |
col2 |
0 |
1 |
2 |
0 |
1 |
(a, b, c) |
a |
b |
c |
1 |
2 |
(d, e, f) |
d |
e |
f |
数据合并
merge方法
一对一
import pandas as pd
df1 = pd.read_excel("测试数据.xlsx", sheet_name="成绩表")
df2 = pd.read_excel("测试数据.xlsx", sheet_name="体育表")
print(df1.head())
print(df2.head())
姓名 语文 数学 英语
0 朱楠 85 11 90
1 李鹏 0 69 68
2 党杰 3 44 94
3 王洁 92 73 8
4 韩健 86 93 72
姓名 体育
0 朱楠 20
1 李鹏 8
2 党杰 90
3 王洁 96
4 韩健 10
# 按条件合并两个表
pd.merge(df1,df2,on='姓名')
|
姓名 |
语文 |
数学 |
英语 |
体育 |
0 |
朱楠 |
85 |
11 |
90 |
20 |
1 |
李鹏 |
0 |
69 |
68 |
8 |
2 |
党杰 |
3 |
44 |
94 |
90 |
3 |
王洁 |
92 |
73 |
8 |
96 |
4 |
韩健 |
86 |
93 |
72 |
10 |
5 |
范晶 |
26 |
16 |
9 |
27 |
6 |
张娜 |
36 |
45 |
5 |
25 |
7 |
林建 |
81 |
64 |
72 |
8 |
8 |
李秀荣 |
32 |
85 |
37 |
24 |
9 |
雷桂芝 |
29 |
26 |
87 |
38 |
pd.merge(df1, df2, left_index=True, right_index=True)
|
姓名_x |
语文 |
数学 |
英语 |
姓名_y |
体育 |
0 |
朱楠 |
85 |
11 |
90 |
朱楠 |
20 |
1 |
李鹏 |
0 |
69 |
68 |
李鹏 |
8 |
2 |
党杰 |
3 |
44 |
94 |
党杰 |
90 |
3 |
王洁 |
92 |
73 |
8 |
王洁 |
96 |
4 |
韩健 |
86 |
93 |
72 |
韩健 |
10 |
5 |
范晶 |
26 |
16 |
9 |
范晶 |
27 |
6 |
张娜 |
36 |
45 |
5 |
张娜 |
25 |
7 |
林建 |
81 |
64 |
72 |
林建 |
8 |
8 |
李秀荣 |
32 |
85 |
37 |
李秀荣 |
24 |
9 |
雷桂芝 |
29 |
26 |
87 |
雷桂芝 |
38 |
print(pd.merge(df1, df2, how="left"))
print(pd.merge(df1, df2, how="right"))
姓名 语文 数学 英语 体育
0 朱楠 85 11 90 20
1 李鹏 0 69 68 8
2 党杰 3 44 94 90
3 王洁 92 73 8 96
4 韩健 86 93 72 10
5 范晶 26 16 9 27
6 张娜 36 45 5 25
7 林建 81 64 72 8
8 李秀荣 32 85 37 24
9 雷桂芝 29 26 87 38
姓名 语文 数学 英语 体育
0 朱楠 85 11 90 20
1 李鹏 0 69 68 8
2 党杰 3 44 94 90
3 王洁 92 73 8 96
4 韩健 86 93 72 10
5 范晶 26 16 9 27
6 张娜 36 45 5 25
7 林建 81 64 72 8
8 李秀荣 32 85 37 24
9 雷桂芝 29 26 87 38
一对多
import pandas as pd
df1 = pd.DataFrame({
'编号':['msb1001','msb1002','msb1003'],
'姓名':['张三','李四','王五'],
})
df2 = pd.DataFrame({
'编号':['msb1001','msb1001','msb1003'],
'语文':[131,122,132],
'数学':[121,142,112],
'英语':[101,102,102],
'月份':['1月','2月','1月']
})
pd.merge(df1,df2,on='编号')
|
编号 |
姓名 |
语文 |
数学 |
英语 |
月份 |
0 |
msb1001 |
张三 |
131 |
121 |
101 |
1月 |
1 |
msb1001 |
张三 |
122 |
142 |
102 |
2月 |
2 |
msb1003 |
王五 |
132 |
112 |
102 |
1月 |
多对多
import pandas as pd
df1 = pd.DataFrame(
{
'编号':['msb1001','msb1002','msb1003','msb1001','msb1002','msb1003'],
'语文':[37,45,56,78,89,90],
'英语':[45,56,67,89,90,67],
'数学':[56,67,78,90,89,78]
}
)
df2 = pd.DataFrame(
{
'编号':['msb1001','msb1002','msb1003','msb1001','msb1001','msb1001'],
'体育':[37,45,56,78,89,90],
}
)
pd.merge(df1,df2)
|
编号 |
语文 |
英语 |
数学 |
体育 |
0 |
msb1001 |
37 |
45 |
56 |
37 |
1 |
msb1001 |
37 |
45 |
56 |
78 |
2 |
msb1001 |
37 |
45 |
56 |
89 |
3 |
msb1001 |
37 |
45 |
56 |
90 |
4 |
msb1002 |
45 |
56 |
67 |
45 |
5 |
msb1003 |
56 |
67 |
78 |
56 |
6 |
msb1001 |
78 |
89 |
90 |
37 |
7 |
msb1001 |
78 |
89 |
90 |
78 |
8 |
msb1001 |
78 |
89 |
90 |
89 |
9 |
msb1001 |
78 |
89 |
90 |
90 |
10 |
msb1002 |
89 |
90 |
89 |
45 |
11 |
msb1003 |
90 |
67 |
78 |
56 |
concat方法
表结构形同纵向连接
import pandas as pd
df1 = pd.read_excel("测试数据.xlsx", sheet_name="concat1")
df2 = pd.read_excel("测试数据.xlsx", sheet_name="concat2")
pd.concat(
[df1, df2],
keys=['表1','表2'],
# ignore_index=True
)
|
|
A |
B |
C |
D |
E |
F |
表1 |
0 |
100 |
42 |
67 |
17 |
37 |
37 |
1 |
20 |
34 |
58 |
7 |
80 |
27 |
2 |
92 |
87 |
71 |
69 |
96 |
60 |
3 |
78 |
63 |
44 |
24 |
55 |
52 |
4 |
64 |
11 |
29 |
70 |
20 |
93 |
5 |
14 |
86 |
28 |
10 |
93 |
98 |
6 |
42 |
11 |
67 |
40 |
11 |
14 |
7 |
77 |
20 |
72 |
80 |
83 |
19 |
8 |
64 |
84 |
1 |
79 |
22 |
39 |
9 |
4 |
100 |
69 |
42 |
83 |
54 |
表2 |
0 |
30 |
42 |
19 |
76 |
90 |
26 |
1 |
7 |
100 |
40 |
7 |
28 |
78 |
2 |
35 |
48 |
9 |
35 |
33 |
19 |
3 |
57 |
1 |
27 |
4 |
2 |
60 |
4 |
41 |
0 |
79 |
50 |
74 |
71 |
5 |
59 |
72 |
9 |
96 |
41 |
45 |
6 |
10 |
3 |
32 |
26 |
10 |
2 |
7 |
80 |
66 |
0 |
7 |
68 |
50 |
8 |
40 |
76 |
97 |
90 |
4 |
39 |
9 |
23 |
22 |
81 |
81 |
63 |
36 |
横向连接
import pandas as pd
df1 = pd.read_excel("测试数据.xlsx", sheet_name="concat1")
df2 = pd.read_excel("测试数据.xlsx", sheet_name="concat2")
pd.concat([df1, df2],axis=1)
|
A |
B |
C |
D |
E |
F |
A |
B |
C |
D |
E |
F |
0 |
100 |
42 |
67 |
17 |
37 |
37 |
30 |
42 |
19 |
76 |
90 |
26 |
1 |
20 |
34 |
58 |
7 |
80 |
27 |
7 |
100 |
40 |
7 |
28 |
78 |
2 |
92 |
87 |
71 |
69 |
96 |
60 |
35 |
48 |
9 |
35 |
33 |
19 |
3 |
78 |
63 |
44 |
24 |
55 |
52 |
57 |
1 |
27 |
4 |
2 |
60 |
4 |
64 |
11 |
29 |
70 |
20 |
93 |
41 |
0 |
79 |
50 |
74 |
71 |
5 |
14 |
86 |
28 |
10 |
93 |
98 |
59 |
72 |
9 |
96 |
41 |
45 |
6 |
42 |
11 |
67 |
40 |
11 |
14 |
10 |
3 |
32 |
26 |
10 |
2 |
7 |
77 |
20 |
72 |
80 |
83 |
19 |
80 |
66 |
0 |
7 |
68 |
50 |
8 |
64 |
84 |
1 |
79 |
22 |
39 |
40 |
76 |
97 |
90 |
4 |
39 |
9 |
4 |
100 |
69 |
42 |
83 |
54 |
23 |
22 |
81 |
81 |
63 |
36 |
交叉连接
import pandas as pd
df1 = pd.read_excel("测试数据.xlsx", sheet_name="concat1")
df2 = pd.read_excel("测试数据.xlsx", sheet_name="concat2")
pd.concat([df1, df2], axis=1,join="inner")
|
A |
B |
C |
D |
E |
F |
A |
B |
C |
D |
E |
F |
0 |
100 |
42 |
67 |
17 |
37 |
37 |
30 |
42 |
19 |
76 |
90 |
26 |
1 |
20 |
34 |
58 |
7 |
80 |
27 |
7 |
100 |
40 |
7 |
28 |
78 |
2 |
92 |
87 |
71 |
69 |
96 |
60 |
35 |
48 |
9 |
35 |
33 |
19 |
3 |
78 |
63 |
44 |
24 |
55 |
52 |
57 |
1 |
27 |
4 |
2 |
60 |
4 |
64 |
11 |
29 |
70 |
20 |
93 |
41 |
0 |
79 |
50 |
74 |
71 |
5 |
14 |
86 |
28 |
10 |
93 |
98 |
59 |
72 |
9 |
96 |
41 |
45 |
6 |
42 |
11 |
67 |
40 |
11 |
14 |
10 |
3 |
32 |
26 |
10 |
2 |
7 |
77 |
20 |
72 |
80 |
83 |
19 |
80 |
66 |
0 |
7 |
68 |
50 |
8 |
64 |
84 |
1 |
79 |
22 |
39 |
40 |
76 |
97 |
90 |
4 |
39 |
9 |
4 |
100 |
69 |
42 |
83 |
54 |
23 |
22 |
81 |
81 |
63 |
36 |
API
reindex函数
reindex 函数用于将现有数据结构(如 Series 或 DataFrame)重新索引,以对齐到新的索引。这通常用于对数据进行对齐或填充缺失的数据。
pandas.Series.reindex(self, new_index, axis=0, method=None, copy=True, level=None, fill_value=np.nan, limit=None, tolerance=None)
pandas.DataFrame.reindex(self, new_index, new_columns, axis=0, method=None, copy=True, level=None, fill_value=None, limit=None, tolerance=None)
参数(Parameters)
- index:新的索引列表。长度必须与要对齐的数据长度一致。
- axis:指定要操作的轴。对于 Series 对象,这个参数将被忽略,因为 Series 只有一维。
- method:插值方法。如果指定,将用于重新索引时填充缺失值。可能的值包括 'ffill'(前向填充)、'bfill'(后向填充)等。
- copy:如果为 True,则即使新索引与旧索引相同也会复制数据。如果为 False,则只有在必要时才会复制。
- level:在多层索引的情况下,用于对齐索引的级别。
- fill_value:用于填充缺失索引的标量值。
- limit:在前向或后向填充时,允许的最大填充量。
- tolerance:在对齐索引时,允许的索引不匹配的最大容差。
set_index函数
这个方法用于将 DataFrame 或 Series 的某个列或多个列设置为索引。
参数(Parameters)
-
keys: 要设置为索引的列标签或列标签列表。可以是单个标签(字符串),多个标签的列表,或者现有的索引数组。
-
drop: 决定是否从数据中删除用作索引的列。如果为 True,则这些列将不再作为 DataFrame 的列存在。
-
append:
- 类型: 如果为 True,则将指定的索引追加到现有的索引中,而不是替换它。
-
verify_integrity: 如果为 True,则会检查新索引是否能够唯一标识每一行,如果新索引中有重复项,则会抛出异常。
-
inplace: 此参数在这段代码中被固定为 True
,意味着 set_index
方法将直接在原对象上进行修改,而不返回新的 DataFrame 或 Series。修改后的原对象将反映新的索引设置。
date_range
date_range 函数是 Pandas 库中用于生成日期序列的非常有用的工具。它允许你指定开始日期、结束日期、期间数、频率等参数来创建一个 DatetimeIndex。以下是 date_range 函数参数的详细说明:
pandas.date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False, name=None, inclusive='both', *, unit=None, **kwargs)
参数
- start: 日期范围的起始日期。如果为 None,则使用 'end' 参数,'periods' 参数指定的数目向前计算。
- end: 日期范围的结束日期。如果为 None,则使用 'start' 参数,'periods' 参数指定的数目向后计算。
- periods: 要生成的日期数量。如果 'start' 和 'end' 都为 None,则不能使用 'periods'。
- freq: 日期的频率。例如 'D' 表示天,'H' 表示小时等。如果为 None,则根据 'start' 和 'end' 的间隔自动推断。
- tz: 时间的时区。例如 'UTC','Asia/Shanghai' 等。
- normalize: 是否将开始日期和结束日期归一化到 '00:00:00'。
- name: 为生成的日期序列设置名称。
- inclusive 在生成的日期范围内,'start' 和 'end' 日期是否包含在内。默认为 'both'。
- unit: 用于指定 'start' 和 'end' 参数的单位,例如 'D' 表示天,'s' 表示秒等。这通常用于 'start' 和 'end' 为数字时。
- **kwargs:传递给底层日期生成器的其他参数。
Timestamp
Timestamp 是一个表示单个时间戳的类,通常用于处理日期和时间。Timestamp 对象可以被创建来表示特定的日期、时间和时区信息。
pd.Timestamp('2017-05-01')
Timestamp('2017-05-01 00:00:00')
import re
import requests
from lxml import etree
def get_html(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
}
response = requests.get(url, headers=headers)
return response.text
text = get_html("https://uuzi.net/latest-iptv-m3u-streams-2024/")
with open("直播源.txt", "a", encoding="utf-8") as f:
for url, title in re.findall(r"<li><a href=(https:.*?m3u8)>(.*?)</a>", text):
f.write(",".join([url, title]) + "\n")
标签:False,
df,
85%,
pd,
print,
20,
Pandas
From: https://www.cnblogs.com/zhangzhanlin/p/18415477