首页 > 其他分享 >Pandas

Pandas

时间:2024-09-15 17:53:07浏览次数:9  
标签: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的区别

  1. 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
  1. applymap
  • applymap 方法是 DataFrame 对象的一个方法。
  • 它用于对 DataFrame 中的每个元素应用一个函数。
  • applymap 总是作用于整个数据框的每个元素,没有 axis 参数。
  • 被弃用,被map函数取代。
df = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
df.map(lambda x: x + 10)
A B
0 11 13
1 12 14
  1. 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

相关文章

  • 【机器学习】嘿马机器学习(科学计算库)第9篇:Pandas,学习目标【附代码文档】
    本教程的知识点为:机器学习(常用科学计算库的使用)基础定位机器学习概述机器学习概述1.5机器学习算法分类1监督学习机器学习概述1.7Azure机器学习模型搭建实验Azure平台简介Matplotlib3.2基础绘图功能—以折线图为例1完善原始折线图—给图形添加辅助功能M......
  • pandas-ai 基于LLM进行数据分析的python 框架
    pandas-ai基于LLM进行数据分析的python框架包含的特性基于自然语言的数据查询数据可视化数据清理特征生成数据链接(支持链接多种不同的数据源)说明对于基于数据分析的场景pandas-ai是一个值得尝试的工具,同时官方也微调了一个BambooLLM的模型(基于mistral)目前也已经在huggingface......
  • autogen示例九:llamaindex的智能pandasai
            相信对于许多从事Python数据分析工作的小伙伴来说,大家都对尝试使用PandasAI所带来的智能化便捷性充满兴趣。然而,由于缺乏OpenAI的API密钥,许多人只能望洋兴叹,无法真正体验到这一技术带来的便利。        现在有一种替代方案,可以让我们绕过这个限制,那......
  • 利用Pandas和Matplotlib进行数据探索性可视化:最佳实践与技巧
    数据可视化是数据分析中不可或缺的一环,它帮助我们更好地理解数据、发现趋势和模式,并有效地传达我们的发现。在Python领域,Pandas和Matplotlib是两个非常强大的库,它们提供了丰富的功能来进行数据分析和可视化。本文将介绍如何结合使用Pandas和Matplotlib进行数据探索性可视化的最佳实......
  • Python 课程6-Pandas 和 Matplotlib库
    前言        在数据科学和数据分析领域,Pandas和Matplotlib是两个最常用的Python库。Pandas主要用于数据处理和分析,而Matplotlib则用于数据的可视化。它们的结合能够帮助我们快速、直观地展示数据的趋势和规律。在这篇详细的教程中,我将为你介绍Pandas和Matp......
  • [1062] The function of geopandas.sjoin
    ref:https://geopandas.org/en/stable/docs/reference/api/geopandas.sjoin.htmlgeopandas.sjoingeopandas.sjoin(left_df, right_df, how='inner', predicate='intersects', lsuffix='left', rsuffix='right', distance=None, o......
  • [1059] Operations of None in pandas
    Inpandas,handlingNonevalues(whicharerepresentedasNaNinDataFrames)isacommontask.Herearesomewaystodealwiththem:FilteringRowsFilterRowswithNoneValues:importpandasaspd#SampleDataFramedf=pd.DataFrame({'A......
  • pandas读取xlsx文件使用sqlachemy写到数据库
    pandas读取xlsx文件使用sqlachemy写到数据库要使用pandas和SQLAlchemy将Excel文件中的数据读取到数据库中,你可以按照以下步骤进行操作:安装必要的库:确保你已经安装了pandas、SQLAlchemy和openpyxl(用于读取Excel文件)。可以使用以下命令安装:pipinstallpandas......
  • 中文关键字检索分析-导出到csv或者excel-多文件或文件夹-使用python和asyncio和pandas
    1.02版本把原来的tab一个个拼接成文件输出,改成pandas的dataframe使用asyncio库来使用协程,但是测试下来速度好像是差不多的。可能速度太快了,没能很好的测出来差异。原来的最初的代码是java版本的,现在用python重写一遍java版本使用completableFuture来异步IO,主要是文件输......
  • NGraphX v1.9.0发布 新增从Pandas DataFrame中读取文档构建向量索引,并优化向量检索器
    新增功能PandasDataFrame读取器:新增功能,支持从PandasDataFrame中加载LlamaIndex所需的文档。任何能加载进PandasDataFrame的文档数据均可连接此节点。功能优化DuckDB&Neo4J检索器:优化消息传递机制,现在可以从上游连接模版消息节点,便于进行进一步处理(如扩写、改......