大家好,我是Mr数据杨!今天将进入Python的Pandas数据世界,就像三国演义中的英雄们,用聪明才智塑造自己的命运。
记得三国中,周瑜曾利用兵法巧妙策划火烧赤壁,击败曹军。这就像创建一个Pandas DataFrame,用不同的方式把数据装入的数据库。周瑜可以用兵书(Dict)、军士(List)、武器(NumPy 数组)来部署军队,同样也可以从各种文件中读取和写入数据,包括HTML、SQL,甚至是压缩和解压缩文件。
再看诸葛亮,他的能力在于洞察一切,通过掌握索引和数据,诸葛亮能从混乱的军情中快速找到需要的信息,就像Pandas中的索引检索,可以快速定位到数据。他对每个将士的武艺、品性都了如指掌,这就像Pandas中的数据类型,每种数据都有其特殊的属性和行为。
在构建赤壁战局的过程中,周瑜和诸葛亮都需要理解他们的军队规模,正如我们需要知道DataFrame的大小。这个大小不仅决定了他们的战略和战术,也决定了Python如何有效地处理和存储数据。
所以,这个世界,既是Python和Pandas的世界,也是我们三国英雄们的世界,都充满了策略、数据和智慧。希望大家在这个旅程中找到自己的乐趣和灵感!
文章目录
- Pandas DataFrame
- 创建 DataFrame
- 使用 Dict 创建
- 使用 List 创建
- 使用 NumPy 数组创建
- 文件读取创建
- 文件的写入方式
- 文件的读取方式
- HTML文件操作方式
- SQL文件方式
- Pickle 文件方式
- 压缩和解压缩文件
- 检索索引和数据
- 索引作为序列
- 数据转为 NumPy 数组
- 数据类型
- DataFrame 大小
Pandas DataFrame
Pandas DataFrame 是包含以二维、行和列组织的数据、对应于行和列的索引的数据结构。使用字典的方式创建DataFrame。
import pandas as pd
df = pd.read_excel("Romance of the Three Kingdoms 13/人物详情数据.xlsx")
df.head()
设定条件查询数据的前 N 行或者后 N 行内容。
df.head(2)
df.tail(2)
查看某列数据的话直接使用字典取值的方式获取即可。
name = df['名前']
name
0 阿会喃
1 韋昭
2 伊籍
3 尹賞
4 尹大目
...
852 卑弥呼
853 韓世忠
854 梁紅玉
855 范蠡
856 荀灌
Name: 名前, Length: 857, dtype: object
也可以像获取类实例的属性一样访问该列数据。
df.名前
0 阿会喃
1 韋昭
2 伊籍
3 尹賞
4 尹大目
...
852 卑弥呼
853 韓世忠
854 梁紅玉
855 范蠡
856 荀灌
Name: 名前, Length: 857, dtype: object
Pandas DataFrame 的每一列都是一个 pandas.Series 实例,保存一维数据及其索引的结构。可以像使用字典一样获取对象的单个项目,Series 方法是使用其索引作为键。
name [10]
'袁胤'
可以使用 .loc[] 访问器访问整行数据。
df.loc[10]
label 对应的行10,其中包含对应行数据之外,还提取了相应列的索引,返回的行也是一个 pandas.Series 实例。
创建 DataFrame
分别使用不同的方式创建DataFrame,创建之前先要导入对应的三方库。
import numpy as np
import pandas as pd
使用 Dict 创建
data = {'x': [1, 2, 3], 'y': np.array([2, 4, 8]), 'z': 100}
pd.DataFrame(data)
x y z
0 1 2 100
1 2 4 100
2 3 8 100
可以用 columns参数控制列的顺序,用index控制行索引的顺序。
pd.DataFrame(d, index=[100, 200, 300], columns=['z', 'y', 'x'])
z y x
100 100 2 1
200 100 4 2
300 100 8 3
使用 List 创建
字典键是列索引,字典值是 DataFrame 中的数据值。
l = [{'x': 1, 'y': 2, 'z': 100},
{'x': 2, 'y': 4, 'z': 100},
{'x': 3, 'y': 8, 'z': 100}]
pd.DataFrame(l)
x y z
0 1 2 100
1 2 4 100
2 3 8 100
还可以使用嵌套列表或列表列表作为数据值,并且创建时需要指明行、列索引。元组和列表创建的方式相同。
l = [[1, 2, 100],
[2, 4, 100],
[3, 8, 100]]
pd.DataFrame(l, columns=['x', 'y', 'z'])
x y z
0 1 2 100
1 2 4 100
2 3 8 100
使用 NumPy 数组创建
arr = np.array([[1, 2, 100],
[2, 4, 100],
[3, 8, 100]])
df_ = pd.DataFrame(arr, columns=['x', 'y', 'z'])
df_
x y z
0 1 2 100
1 2 4 100
2 3 8 100
文件读取创建
可以在多种文件类型(包括 CSV、Excel、SQL、JSON 等)中保存和加载Pandas DataFrame 中的数据和索引。
我们将使用《三國志 13》的人物数据作为示例,数据存储在Excel文件中(人物详情数据.xlsx),具体列的说明如下:
- 基本信息列:名前、字、読み、性別、生年、登場、没年、寿命、死因、父親、母親、相性、列伝。
- 内政能力列:商業、農業、文化、訓練、巡察、説破、交渉、弁舌、人徳。
- 军事能力列:威風、神速、奮戦、連戦、攻城、兵器、堅守、水連、一騎、豪傑、鬼謀。
- 其他信息列:音声、武器、性格、義理、勇愛、才愛、分類、武具興味、書物興味、宝物興味、酒興味、物欲。
先将生成的数据保存到不同的文件中。
import pandas as pd
data = {'名前': ['阿会喃', '韋昭', '伊籍', '尹賞', '尹大目'],
'字': ['-', '弘嗣', '機伯', '-', '-'],
'読み': ['-', 'コウシ', 'キハク', '-', '-'],
'性別': ['男', '男', '男', '男', '男'],
'生年': [190, 204, 162, 194, 211],
'登場': [217, 223, 189, 213, 230],
'没年': [225, 273, 226, 260, 270],
'寿命': [36, 70, 65, 67, 60],
'死因': ['不自然死', '不自然死', '自然死', '自然死', '自然死'],
'父親': ['-', '-', '-', '-', '-'],
'母親': ['-', '-', '-', '-', '-'],
'相性': ['62', '131', '77', '72', '38'],
'列伝': ['孟獲の配下。第三洞の元帥。\n【演義】諸葛亮の南蛮征圧で、張翼に襲撃されて捕らえられる。董荼那ともども、諸葛亮に解放されて心服するが、同じく解放されながらも服従しない孟獲の命で沙口の守備に派遣される。次の戦いで馬岱との対戦を避けた董荼那が孟獲に処罰されると、董荼那と結託して孟獲を捕らえ蜀軍に引き渡した。その後、再び釈放された孟獲が諸葛亮に心服したものと誤解し、孟獲に誘い出されて董荼那と共に殺された。\n【正史】記述なし。',
'呉の幕僚。正史では、司馬昭の名を避けて、韋曜と記される。\n【演義】記述なし。\n【正史】太子・孫和の命で「博奕論」を著し、博奕(すごろく)が益体のない遊びだと論じた。孫亮が即位すると諸葛恪に推薦され、薛瑩、華覈らと共に「呉書」の編集に当たる。しかし、孫晧が即位すると「呉書」の編集方針を巡って孫晧と対立。下戸だったがむりやり酒を飲まされ、態度が反抗的だとして処刑された。華覈とは親交が篤く、華覈は最後まで韋昭の助命嘆願に奔走した。',
'劉表の幕僚。後に劉備に仕える。\n【演義】劉表が劉備から贈られた的盧を返した時、的盧の凶相が乗り手に祟るという逸話を劉備に伝える。蔡瑁が劉備暗殺を測った時は劉備に危機を伝え逃亡させた。劉表が死に、後を継いだ劉琮が早々に降伏すると、劉備に仕え関羽と共に荊州を守る。荊州が呂蒙の攻撃を受けると馬良と共に救援要請のため成都に向かい、関羽が死ぬと成都に残った。その後、劉備に皇帝になるよう勧めた。\n【正史】使者としての機知、応対を孫権に感心された。諸葛亮、法正、劉巴、李厳らと蜀科(蜀の法律)を作った。',
'天水の武将。魏に仕えた後、蜀に降る。\n【演義】姜維の友人。諸葛亮が天水を攻めた時、先に蜀に降伏していた姜維と連絡を取り合う。蜀軍が攻め寄せると同僚の梁緒と謀って城門を開き、蜀軍を招き入れた。\n【正史】諸葛亮が天水を攻めた時、天水太守の馬遵から異心ありと疑われる。馬遵が逃走したため、姜維、梁虔、梁緒と共に降伏。蜀の滅亡前に死んだ。',
'大目は字。名は不詳。曹爽の腹心。\n【演義】曹爽が司馬懿に処刑された後、仇を討つために偽って司馬師の部下となる。友人の文欽が毌丘倹と共に反乱を起こした時、文欽に司馬師の死が近いことを知らせようとするが、その意図が伝わらず追い返された。\n【正史】少年の頃、曹氏の召使いとなり、そのまま皇帝の側に仕えた。'],
'商業': [0, 1, 5, 0, 0],
'農業': [0, 0, 4, 0, 1],
'文化': [0, 0, 5, 0, 0],
'訓練': [2, 0, 0, 0, 0],
'巡察': [1, 0, 0, 0, 0],
'説破': [0, 1, 5, 0, 0],
'交渉': [0, 0, 5, 2, 0],
'弁舌': [0, 0, 4, 1, 0],
'人徳': [0, 0, 0, 0, 0],
'威風': [0, 0, 0, 0, 0],
'神速': [0, 0, 0, 0, 0],
'奮戦': [1, 0, 0, 0, 0],
'連戦': [0, 0, 0, 0, 0],
'攻城': [0, 0, 0, 0, 0],
'兵器': [0, 0, 0, 0, 0],
'堅守': [0, 0, 0, 0, 0],
'水連': [0, 0, 0, 0, 0],
'一騎': [0, 0, 0, 0, 0],
'豪傑': [0, 0, 0, 0, 0],
'鬼謀': [0, 0, 0, 0, 0],
'音声': ['無骨男', '丁寧男', '策士男', '丁寧男', '老獪男'],
'武器': ['刀', '弓', '弓', '弓', '弓'],
'性格': ['猪突', '豪胆', '冷静', '冷静', '小心'],
'義理': ['普通', '重視', '重視', '普通', '普通'],
'勇愛': ['重視', '普通', '軽視', '普通', '重視'],
'才愛': ['軽視', '重視', '最重視', '重視', '重視'],
'分類': ['武官', '文官', '文官', '文官', '文官'],
'武具\n興味': ['なし', 'なし', 'なし', 'なし', 'なし'],
'書物\n興味': ['なし', 'あり', 'あり', 'なし', 'なし'],
'宝物\n興味': ['あり', 'なし', 'なし', 'あり', 'あり'],
'酒\n興味': ['あり', 'なし', '普通', '普通', 'なし'],
'物欲': ['強欲', '無欲', '無欲', '普通', '無欲']}
columns_name = ['名前', '字', '読み', '性別', '生年', '登場', '没年', '寿命', '死因', '父親', '母親', '相性',
'列伝', '商業', '農業', '文化', '訓練', '巡察', '説破', '交渉', '弁舌', '人徳', '威風', '神速',
'奮戦', '連戦', '攻城', '兵器', '堅守', '水連', '一騎', '豪傑', '鬼謀', '音声', '武器', '性格',
'義理', '勇愛', '才愛', '分類', '武具\n興味', '書物\n興味', '宝物\n興味', '酒\n興味', '物欲'
]
df = pd.DataFrame(data=data,columns=columns_name)
df.to_csv('data.csv')
df.to_excel('data.xlsx')
将数据读取到DataFrame对象中。
import pandas as pd
df = pd.read_excel("Romance of the Three Kingdoms 13/人物详情数据.xlsx")
df
文件的写入方式
Series 和 DataFrame 对象具有能够将数据和标签写入剪贴板或文件的方法。以 pattern 命名.to_<file-type>(),其中<file-type>是目标文件的类型。
.to_json()
: 将数据保存为JSON格式文件。.to_html()
: 将数据保存为HTML格式文件。.to_sql()
: 将数据保存到SQL数据库中。.to_pickle()
: 将数据保存为pickle格式文件。
文件的读取方式
与文件写入对应,Pandas还提供了相应的读取方法。下面是几种常用的读取方法:
.read_csv()
: 从CSV文件中读取数据。.read_excel()
: 从Excel文件中读取数据。.read_json()
: 从JSON文件中读取数据。.read_html()
: 从HTML文件中读取数据。.read_sql()
: 从SQL数据库中读取数据。.read_pickle()
: 从pickle文件中读取数据。
HTML文件操作方式
HTML是一种纯文本文件格式,使用超文本标记语言在浏览器中呈现网页。HTML文件的扩展名为.html
或.htm
。处理和解析HTML文件需要安装lxml
或html5lib
。
示例代码:
pip install lxml html5lib
使用to_html()
方法将数据保存为HTML文件。
示例代码:
df = pd.DataFrame(data).T
df.to_html('temp_data/data.html')
在保存HTML文件时,还可以使用其他一些参数:
header
:是否保存列名。index
:是否保存行标签。classes
:为CSS类分配级联样式表。render_links
:指定是否将URL转换为HTML链接。table_id
:为id标签table分配CSS。escape
:决定是否将字符<
、>
和&
转换为HTML安全字符串。
SQL文件方式
Pandas的IO工具还可以读写数据库,需要使用SQLAlchemy进行操作。Python内置了一个SQLite驱动程序。
安装SQLAlchemy:
pip install sqlalchemy
使用create_engine()
方法导入并创建数据库引擎。
示例代码:
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://user:password@localhost/sanguo?charset=utf8')
使用to_sql()
方法保存数据到数据库。
示例代码:
df.to_sql('table', con=engine, if_exists='append', index=0)
具有相同名称和路径的数据库可以执行以下操作:
if_exists='fail'
:引发ValueError错误。- `if_exists=‘replace’
`:删除表并插入新值。
if_exists='append'
:将新值插入表中。
Pickle 文件方式
Pickling是将Python对象转换为字节流的过程。Python的pickle文件是保存Python对象及其数据结构的二进制文件,通常具有.pickle
或.pkl
的扩展名。
使用to_pickle()
方法保存数据到pickle文件。
示例代码:
df.to_pickle('temp_data/data.pickle')
使用read_pickle()
方法从pickle文件中读取数据。
示例代码:
df = pd.read_pickle('temp_data/data.pickle')
压缩和解压缩文件
常见的文件压缩后缀包括.gz
、.bz2
、.zip
、.xz
。
Pandas的数据保存时可以自动推断压缩类型。
示例代码:
df.to_csv('temp_data/data.csv')
df.to_csv('temp_data/data.csv.zip')
df.to_csv('temp_data/data.csv.gz')
df.to_csv('temp_data/data.csv.xz')
df.to_csv('temp_data/data.csv.bz2')
可以使用read_csv()
方法读取压缩文件。
示例代码:
df = pd.read_csv('temp_data/data.csv.zip', index_col=0)
Pickle文件的压缩方法和读取方法。
示例代码:
df = pd.DataFrame(data).T
df.to_pickle('temp_data/data.pickle.compress', compression='gzip')
df = pd.read_pickle('temp_data/data.pickle.compress', compression='gzip')
检索索引和数据
创建 DataFrame 后可以进行一些检索、修改操作。
索引作为序列
df.index
RangeIndex(start=0, stop=5, step=1)
df.columns
Index(['名前', '字', '読み', '性別', '生年', '登場', '没年', '寿命', '死因', '父親', '母親', '相性',
'列伝', '商業', '農業', '文化', '訓練', '巡察', '説破', '交渉', '弁舌', '人徳', '威風', '神速',
'奮戦', '連戦', '攻城', '兵器', '堅守', '水連', '一騎', '豪傑', '鬼謀', '音声', '武器', '性格',
'義理', '勇愛', '才愛', '分類', '武具\n興味', '書物\n興味', '宝物\n興味', '酒\n興味', '物欲'],
dtype='object')
df.columns[0]
'名前'
用序列修改索引。
df.index = np.arange(10, 15)
df.index
Int64Index([10, 11, 12, 13, 14], dtype='int64')
df
数据转为 NumPy 数组
转化之后取值方式同List操作。
df.to_numpy()
array([['阿会喃', '-', '-', '男', 190, 217, 225, 36, '不自然死', '-', '-', '62',
'孟獲の配下。第三洞の元帥。\n【演義】諸葛亮の南蛮征圧で、張翼に襲撃されて捕らえられる。董荼那ともども、諸葛亮に解放されて心服するが、同じく解放されながらも服従しない孟獲の命で沙口の守備に派遣される。次の戦いで馬岱との対戦を避けた董荼那が孟獲に処罰されると、董荼那と結託して孟獲を捕らえ蜀軍に引き渡した。その後、再び釈放された孟獲が諸葛亮に心服したものと誤解し、孟獲に誘い出されて董荼那と共に殺された。\n【正史】記述なし。',
0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
'無骨男', '刀', '猪突', '普通', '重視', '軽視', '武官', 'なし', 'なし', 'あり', 'あり',
'強欲'],
......
['尹大目', '-', '-', '男', 211, 230, 270, 60, '自然死', '-', '-', '38',
'大目は字。名は不詳。曹爽の腹心。\n【演義】曹爽が司馬懿に処刑された後、仇を討つために偽って司馬師の部下となる。友人の文欽が毌丘倹と共に反乱を起こした時、文欽に司馬師の死が近いことを知らせようとするが、その意図が伝わらず追い返された。\n【正史】少年の頃、曹氏の召使いとなり、そのまま皇帝の側に仕えた。',
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'老獪男', '弓', '小心', '普通', '重視', '重視', '文官', 'なし', 'なし', 'あり', 'なし',
'無欲']], dtype=object)
数据类型
数据值的类型,也称为数据类型或 dtypes
,决定了 DataFrame 使用的内存量,以及计算速度和精度水平。
查看数据类型。
df.dtypes
名前 object
字 object
読み object
性別 object
生年 int64
登場 int64
没年 int64
......
dtype: object
使用.astype()
更改数据类型。
df_ = df.astype(dtype={'生年': np.int32, '没年': np.int32})
df_.dtypes
名前 object
字 object
読み object
性別 object
生年 int32
登場 int64
没年 int32
......
dtype: object
DataFrame 大小
.ndim
、.size
和.shape
分别返回维度数、每个维度上的数据值数和数据值总数。
df_.ndim
2
df_.shape
(5, 45)
df_.size
225