数据科学必备Pandas数据预处理方法汇总

学Python数据科学,玩游戏、学日语、搞编程一条龙。

整套学习自学教程中应用的数据都是《三國志》、《真·三國無雙》系列游戏中的内容。

Pandas DataFrame 是一个包含二维数据及其对应索引的结构。DataFrame 广泛用于数据科学、机器学习、科学计算和许多其他数据密集型领域。

DataFrame 类似于SQL 表或在 Excel 中使用的电子表格。不过从处理数据的效率上来说比 SQL 和 Excel 更快,而且功能更全。

在这里插入图片描述

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 中的数据和索引。

先将生成的数据保存到不同的文件中。

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 后可以进行一些检索、修改操作。

索引作为序列

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

名前        objectobject
読み        object
性別        object
生年         int64
登場         int64
没年         int64
......

dtype: object

使用.astype() 更改数据类型。

df_ = df.astype(dtype={
    
    '生年': np.int32, '没年': np.int32})

df_.dtypes
名前        objectobject
読み        object
性別        object
生年         int32
登場         int64
没年         int32
......

dtype: object

DataFrame 大小

.ndim、.size和.shape分别返回维度数、每个维度上的数据值数和数据值总数。

df_.ndim
2

df_.shape
(5, 45)

df_.size
225

访问和修改数据

使用访问器获取数据

除了.loc[] 可以使用通过索引获取行或列的访问器之外,Pandas 还提供了访问器.iloc[],它通过整数索引检索行或列。

df.loc[10]
名前                                                      阿会喃
字                                                         -
読み                                                        -
性別                                                        男
生年                                                      190
登場                                                      217
没年                                                      225
......
酒\n興味                                                    あり
物欲                                                       強欲
Name: 10, dtype: object

df.iloc[0]
名前                                                      阿会喃
字                                                         -
読み                                                        -
性別                                                        男
生年                                                      190
登場                                                      217
没年                                                      225
......
酒\n興味                                                    あり
物欲                                                       強欲
Name: 10, dtype: object

.loc[] 和 .iloc[] 支持切片和 NumPy 的索引操作。

df.loc[:, '名前']

10    阿会喃
11     韋昭
12     伊籍
13     尹賞
14    尹大目
Name: 名前, dtype: object

df.iloc[:, 1]

10    阿会喃
11     韋昭
12     伊籍
13     尹賞
14    尹大目
Name: 名前, dtype: object

提供切片以及列表或数组而不是索引来获取多行或多列。

df.loc[11:15, ['名前', '字']]

     名前	字
11	韋昭	弘嗣
12	伊籍	機伯
13	尹賞	-
14	尹大目	-

df.iloc[1:6, [0, 1]]

     名前	字
11	韋昭	弘嗣
12	伊籍	機伯
13	尹賞	-
14	尹大目	-

.iloc[] 使用与切片元组、列表和 NumPy 数组相同的方式跳过行和列。

df.iloc[1:6:2, 0]

11    韋昭
13    尹賞
Name: 名前, dtype: object

使用 Python 内置的 **slice()**类,numpy.s_[] 或者 pd.IndexSlice[]。

df.iloc[slice(1, 6, 2), 0]

11    韋昭
13    尹賞
Name: 名前, dtype: object

df.iloc[np.s_[1:6:2], 0]

11    韋昭
13    尹賞
Name: 名前, dtype: object

df.iloc[pd.IndexSlice[1:6:2], 0]

11    韋昭
13    尹賞
Name: 名前, dtype: object

使用 .loc[] 和 .iloc[] 获取特定的数据值。但只需要一个值时建议使用专门的访问器 .at[] 和 .iat[]。

df.at[12, '名前']
'伊籍'

df.iat[2, 0]
'伊籍'

使用访问器设置数据

可以使用访问器通过传递 Python 序列、NumPy 数组或单个值来修改数据。

df.loc[:, '生年']

10    190
11    204
12    162
13    194
14    211
Name: 生年, dtype: int64

df.loc[:13, '生年'] = [40, 50, 60, 70]
df.loc[14:, '生年'] = 0

df['生年']

10    40
11    50
12    60
13    70
14     0
Name: 生年, dtype: int64

使用负索引 .iloc[] 来访问或修改数据。

df.iloc[:, -10] = np.array([88.0, 79.0, 81.0, 80.0, 68.0, 61.0, 84.0])w
df['生年']

10    88.0
11    79.0
12    81.0
13    80.0
14    68.0
Name: 生年, dtype: float64

插入和删除数据

Pandas 提供了几种方便的方法来插入和删除行或列。

插入和删除行

创建一个插入的新数据。

new = pd.Series(data=['Mr数据杨', 'xxx', "-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-",],index=df.columns)


名前        Mr数据杨
字           xxx
読み            -
性別            -
生年            -
登場            -
没年            -
寿命            -
......
物欲            -
dtype: object

使用 df.append() 加入新的数据。

df = df.append(pd.DataFrame(new).T)
df

在这里插入图片描述

使用 df.drop() 删除新的数据。

df = df.drop(labels=[17])
df

在这里插入图片描述

插入和删除列

直接赋值定义列名和定义数据。

df['temp_data'] = np.array([71.0, 95.0, 88.0, 79.0, 91.0])
df

在这里插入图片描述

df['temp_data'] = 0.0
df

在这里插入图片描述

.insert() 在列的指定位置插入列数据。

df.insert(loc=4, column='new_temp_data',value=np.array([86.0, 81.0, 78.0, 88.0, 74.0, 70.0, 81.0]))
df

在这里插入图片描述

del 删除一列或者多列。

del df['new_temp_data]
df

在这里插入图片描述

使用 df.drop() 删除列。

df = df.drop(labels='age', axis=1)
df

在这里插入图片描述

应用算术运算

应用基本的算术运算。

df['没年'] - df['生年']

10    137
11    194
12    145
13    180
14    202
dtype: object

df['寿命'] / 100

10    0.36
11     0.7
12    0.65
13    0.67
14     0.6
Name: 寿命, dtype: object

线性组合公式计算汇总数据。

df['total'] =0.4 * df['商業'] + 0.3 * df['農業'] + 0.3 * df['文化']
df

在这里插入图片描述

应用 NumPy 和 SciPy 函数

大多数 NumPy 和 SciPy 都可以作为参数而不是 NumPy 数组应用于 Pandas Series 或 DataFrame 对象。 可以使用 NumPy 的 numpy.average() 计算考生的总考试成绩。

import numpy as np

data = df.iloc[:, 13:16]
data


   商業	農業 文化
10	0	0	0
11	1	0	0
12	5	4	5
13	0	0	0
14	0	1	0

np.average(data.astype(np.float),axis=1,weights=[0.4, 0.3, 0.3])
array([0. , 0.4, 4.7, 0. , 0.3])
del df['total']
df['total'] = np.average(df.iloc[:, 13:16].astype(np.float), axis=1,weights=[0.4, 0.3, 0.3])
df

在这里插入图片描述

DataFrame 进行排序

.sort_values() 进行数据排序,需要指定排序的列。

df.sort_values(by='寿命', ascending=False)

在这里插入图片描述

也可以指定多个列和多个列的排序方式。

df.sort_values(by=['生年', '寿命'], ascending=[False, False])

在这里插入图片描述

DataFrame 过滤数据

Pandas 的过滤功能工作方式类似于在 NumPy 中使用布尔数组进行索引。

filter_ = df['寿命'] >= 50
filter_

10    False
11     True
12     True
13     True
14     True
Name: 寿命, dtype: bool

使用表达式 df[filter_] 返回一个 DataFrame 中 True 的行数据。

df[filter_]

在这里插入图片描述

可是使用逻辑运算进行多条件的筛选。

df[(df['生年'] >= 80) & (df['寿命'] >= 65)]

在这里插入图片描述

使用.where() 可以替换不满足所提供条件的位置的值。

df['登場'].where(cond=df['登場'] >= 220, other=0.0)

10      0
11    223
12      0
13      0
14    230
Name: 登場, dtype: object

DataFrame 数据统计

基本统计信息使用 .describe()

df.describe()

total
count	5.000000
mean	1.080000
std	2.031502
min	0.000000
25%	0.000000
50%	0.300000
75%	0.400000
max	4.700000

特定统计信息可以直接进行索引方法调用。

df.mean()
total    1.08
dtype: float64

df['total'].mean()
1.08

df.std()
total    2.031502
dtype: float64

df['total'].std()
2.031502

DataFrame 处理缺失数据

缺失数据在数据科学和机器学习中非常常见。Pandas 具有非常强大的处理缺失数据的功能。

Pandas 通常用 NaN(不是数字)值表示缺失数据。 在 Python 中可以使用 float(‘nan’)、math.nan 或 numpy.nan 获取 NaN。 从 Pandas 1.0 开始BooleanDtype、Int8Dtype、Int16Dtype、Int32Dtype 和 Int64Dtype 等新类型使用 pandas.NA 作为缺失值。

df_ = pd.DataFrame({
    
    'x': [1, 2, np.nan, 4]})
df_
     x
0  1.0
1  2.0
2  NaN
3  4.0

缺失数据进行计算

许多 Pandas 方法在执行计算时会忽略 nan 值,除非明确指示。

df = pd.read_excel("Romance of the Three Kingdoms 13/人物详情数据.xlsx",sheet_name="包含null")
df.head()

df_.mean()

生年    180.283547
登場    201.185531
没年    233.568261
寿命     54.284714
商業      0.770128
農業      0.631272
文化      0.719953
訓練      1.323221
巡察      1.079347
説破      0.821470
交渉      0.929988
弁舌      0.879813
人徳      0.142357
威風      0.285881
神速      0.871645
奮戦      0.536756
連戦      0.592765
攻城      0.658110
兵器      0.064177
堅守      0.640607
水連      0.625438
一騎      0.614936
豪傑      0.259043
鬼謀      0.253209
dtype: float64

df.mean(skipna=False)

生年    180.283547
登場    201.185531
没年    233.568261
寿命     54.284714
商業      0.770128
農業      0.631272
文化      0.719953
訓練      1.323221
巡察      1.079347
説破      0.821470
交渉      0.929988
弁舌      0.879813
人徳      0.142357
威風      0.285881
神速      0.871645
奮戦      0.536756
連戦      0.592765
攻城      0.658110
兵器      0.064177
堅守      0.640607
水連      0.625438
一騎      0.614936
豪傑      0.259043
鬼謀      0.253209
dtype: float64

填充缺失数据

.fillna() 进行缺失数据填充。

# 指定填充数据
df.fillna(value="-")

在这里插入图片描述

# 向前填充
df.fillna(method='ffill')

在这里插入图片描述

# 向后填充
df.fillna(method='bfill')

在这里插入图片描述

删除缺少数据的行和列

使用 .dropna() 直接进行处理。

df.dropna()

在这里插入图片描述

遍历 DataFrame

使用.items()and .iteritems() 遍历 Pandas DataFrame 的列。每次迭代都会产生一个以列名和列数据作为Series对象的元组。

for col_label, col in df.iteritems():
	print(col_label, col, sep='\n', end='\n\n')

名前
0      阿会喃
1       韋昭
2       伊籍
3       尹賞
4      尹大目
      ... 
852    卑弥呼
853    韓世忠
854    梁紅玉
855     范蠡
856     荀灌
Name: 名前, Length: 857, dtype: object0      NaN
1       弘嗣
2       機伯
3      NaN
4      NaN
      ... 
852    NaN
853    NaN
854    NaN
855    NaN
856    NaN
Name:, Length: 857, dtype: object

読み
0      NaN
1      コウシ
2      キハク
3      NaN
4      NaN
      ... 
852    NaN
853    NaN
854    NaN
855    NaN
856    NaN
Name: 読み, Length: 857, dtype: object

性別
01234..
852853854855856    女
Name: 性別, Length: 857, dtype: object

生年
0      190
1      204
2      162
3      194
4      211
      ... 
852    169
853    170
854    170
855    170
856    170
Name: 生年, Length: 857, dtype: int64

登場
0      217
1      223
2      189
3      213
4      230
      ... 
852    184
853    184
854    184
855    184
856    184
Name: 登場, Length: 857, dtype: int64

没年
0      225
1      273
2      226
3      260
4      270
      ... 
852    268
853    268
854    268
855    268
856    268
Name: 没年, Length: 857, dtype: int64

寿命
0       36
1       70
2       65
3       67
4       60
      ... 
852    100
853     99
854     99
855     99
856     99
Name: 寿命, Length: 857, dtype: int64
......

使用 .iterrows() 遍历 DataFrame 的行。

for row_label, row in df.iterrows():
	print(row_label, row, sep='\n', end='\n\n')

0
名前                                                      阿会喃
字                                                       NaN
読み                                                      NaN
性別                                                        男
生年                                                      190
登場                                                      217
没年                                                      225
寿命                                                       36
死因                                                     不自然死
父親                                                      NaN
母親                                                      NaN
相性                                                       62
列伝        孟獲の配下。第三洞の元帥。\n【演義】諸葛亮の南蛮征圧で、張翼に襲撃されて捕らえられる。董荼...
商業                                                        0
農業                                                        0
文化                                                        0
訓練                                                        2
巡察                                                        1
説破                                                        0
交渉                                                        0
弁舌                                                        0
人徳                                                        0
威風                                                        0
神速                                                        0
奮戦                                                        1
連戦                                                        0
攻城                                                        0
兵器                                                        0
堅守                                                        0
水連                                                        0
一騎                                                        0
豪傑                                                        0
鬼謀                                                        0
音声                                                      無骨男
武器                                                        刀
性格                                                       猪突
義理                                                       普通
勇愛                                                       重視
才愛                                                       軽視
分類                                                       武官
武具\n興味                                                   なし
書物\n興味                                                   なし
宝物\n興味                                                   あり
酒\n興味                                                    あり
物欲                                                       強欲
Name: 0, dtype: object
......

DataFrame 时间序列

使用时间序列创建index

创建一个一天中的每小时温度数据 DataFrame。

temp_c = [ 8.0,  7.1,  6.8,  6.4,  6.0,  5.4,  4.8,  5.0,
           9.1, 12.8, 15.3, 19.1, 21.2, 22.1, 22.4, 23.1,
           21.0, 17.9, 15.5, 14.4, 11.9, 11.0, 10.2,  9.1]

使用 date_range() 构建时间索引。

dt = pd.date_range(start='2022-04-16 00:00:00.0', periods=24,freq='H')
df
DatetimeIndex(['2022-04-16 00:00:00', '2022-04-16 01:00:00',
               '2022-04-16 02:00:00', '2022-04-16 03:00:00',
               '2022-04-16 04:00:00', '2022-04-16 05:00:00',
               '2022-04-16 06:00:00', '2022-04-16 07:00:00',
               '2022-04-16 08:00:00', '2022-04-16 09:00:00',
               '2022-04-16 10:00:00', '2022-04-16 11:00:00',
               '2022-04-16 12:00:00', '2022-04-16 13:00:00',
               '2022-04-16 14:00:00', '2022-04-16 15:00:00',
               '2022-04-16 16:00:00', '2022-04-16 17:00:00',
               '2022-04-16 18:00:00', '2022-04-16 19:00:00',
               '2022-04-16 20:00:00', '2022-04-16 21:00:00',
               '2022-04-16 22:00:00', '2022-04-16 23:00:00'],
              dtype='datetime64[ns]', freq='H')

使用日期时间值作为行索引很方便。

                    temp_c
2022-04-16 00:00:00	8.0
2022-04-16 01:00:00	7.1
2022-04-16 02:00:00	6.8
2022-04-16 03:00:00	6.4
2022-04-16 04:00:00	6.0
2022-04-16 05:00:00	5.4
2022-04-16 06:00:00	4.8
2022-04-16 07:00:00	5.0
2022-04-16 08:00:00	9.1
2022-04-16 09:00:00	12.8
2022-04-16 10:00:00	15.3
2022-04-16 11:00:00	19.1
2022-04-16 12:00:00	21.2
2022-04-16 13:00:00	22.1
2022-04-16 14:00:00	22.4
2022-04-16 15:00:00	23.1
2022-04-16 16:00:00	21.0
2022-04-16 17:00:00	17.9
2022-04-16 18:00:00	15.5
2022-04-16 19:00:00	14.4
2022-04-16 20:00:00	11.9
2022-04-16 21:00:00	11.0
2022-04-16 22:00:00	10.2
2022-04-16 23:00:00	9.1

索引和切片

用切片来获取部分信息。

temp["2022-04-16 02:00:00":"2022-04-16 08:00:00"]
	                temp_c
2022-04-16 02:00:00	6.8
2022-04-16 03:00:00	6.4
2022-04-16 04:00:00	6.0
2022-04-16 05:00:00	5.4
2022-04-16 06:00:00	4.8
2022-04-16 07:00:00	5.0
2022-04-16 08:00:00	9.1

重采样

使用 .resample() 进行重采样选取数据。

temp.resample(rule='6h').mean()
	                temp_c
2022-04-16 00:00:00	6.616667
2022-04-16 06:00:00	11.016667
2022-04-16 12:00:00	21.283333
2022-04-16 18:00:00	12.016667

窗口滚动

使用 .rolling() 进行固定长度滚动窗口分析,指定数量的相邻行计算统计数据。

temp.rolling(window=3).mean()
temp_c
2022-04-16 00:00:00	NaN
2022-04-16 01:00:00	NaN
2022-04-16 02:00:00	7.300000
2022-04-16 03:00:00	6.766667
2022-04-16 04:00:00	6.400000
2022-04-16 05:00:00	5.933333
2022-04-16 06:00:00	5.400000
2022-04-16 07:00:00	5.066667
2022-04-16 08:00:00	6.300000
2022-04-16 09:00:00	8.966667
2022-04-16 10:00:00	12.400000
2022-04-16 11:00:00	15.733333
2022-04-16 12:00:00	18.533333
2022-04-16 13:00:00	20.800000
2022-04-16 14:00:00	21.900000
2022-04-16 15:00:00	22.533333
2022-04-16 16:00:00	22.166667
2022-04-16 17:00:00	20.666667
2022-04-16 18:00:00	18.133333
2022-04-16 19:00:00	15.933333
2022-04-16 20:00:00	13.933333
2022-04-16 21:00:00	12.433333
2022-04-16 22:00:00	11.033333
2022-04-16 23:00:00	10.100000

DataFrame 绘图

Pandas 允许基于 DataFrames 可视化数据或创建绘图。它在后台使用Matplotlib ,因此利用 Pandas 的绘图功能与使用 Matplotlib 非常相似。

import matplotlib.pyplot as plt
temp.plot()
plt.show()

在这里插入图片描述
图像的保存。

temp.plot().get_figure().savefig('tmp.png')

其他图表,比如直方图。

df.loc[:, ['py-score', 'total']].plot.hist(bins=5, alpha=0.4)
plt.show()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_20288327/article/details/124841069