pandas上

pandas上

1 什么是Pandas

pandas是一种高性能、易于使用的数据结构和数据分析工具,其有两种主要数据类型:
Series 一维,带标签数组
DataFrame 二维,Series容器

2 Series

(1)Series对象的创建与类型

未指定索引,索引就是0,1,2,3,4……

pandas上
指定索引
pandas上
通过字典创建一个Series,此时字典的键就是索引
pandas上
dtype(‘0’)表示object类型

; (2)修改类型

pandas上

(2)取值

Series对象可以根据键取值,也可以根据位置取值,其实本质都是根据索引取值

pandas上

; (3)索引

pandas上

(4)索引和值

pandas上

; (5)unique()的功能

unique()相当于集合操作,即去掉重复,只有Series对象才能调用,DataFrame不行

pandas上

2 查看pandas的官方文档

以series的where为例

(1) 百度 pandas series where

点击第一个

pandas上

; (2) 翻到下面找到实例

pandas上

3 DataFrame

Series对象是一维的,如果数据是二维的,该怎么办?
此时可以使用DataFrame(数据框)来处理,DataFrame是Series的容器。

(1)DataFrame对象的创建

a 通过读取表格创建,行索引与列索引

使用pd.read_csv()方法可以读取数据

import pandas as pd
df = pd.read_csv("./dogNames2.csv")
print(df)
print(type(df))

输出

     Row_Labels  Count_AnimalName
0         RENNY                 1
1        DEEDEE                 2
2     GLADIATOR                 1
3        NESTLE                 1
4          NYKE                 1
...         ...               ...

4159    ALEXXEE                 1
4160  HOLLYWOOD                 1
4161      JANGO                 2
4162  SUSHI MAE                 1
4163      GHOST                 3

[4164 rows x 2 columns]
<class 'pandas.core.frame.DataFrame'>

0 1 2 …这些都是行索引,Row_Labels和Count_AnimalName则为列索引

DataFrame对象既有行索引,又有列索引
行索引,表明不同行,横向索引,叫index,0轴,axis=0
列索引,表名不同列,纵向索引,叫columns,1轴,axis=1

b 通过读取JSON文件创建

大数据集通常存储到JSON文件中,或者从JSON文件中读取。

pandas上
使用 read_json()方法读取

; b 通过字典或列表创建

字典里面嵌列表(以列表为值)

pandas上

列表里面嵌字典,每一条记录以字典的形式作为列表的一个元素,即列表里有多个字典,每个字典只记录一条数据

pandas上
如果某些字段有缺失,则系统自动用NaN 代替,NaN类似于np.nan

c 通过numpy对象创建列表

import pandas as pd
import numpy as np
t = pd.DataFrame(np.arange(12).reshape((2,6)))
print(t)
print(type(t))

输出

   0  1  2  3   4   5
0  0  1  2  3   4   5
1  6  7  8  9  10  11
<class 'pandas.core.frame.DataFrame'>

也可以在建立DataFrame对象的同时,指定其行索引和列索引

pandas上

(2)DataFrame的基本属性与查询情况

和一个ndarray一样,我们通过shape,ndim,dtype了解这个ndarray的基本信息

pandas上
df.head(3)和df.tail(3)返回的类型并不为Series,而是DataFrame,df.describe只有对数值型(int、float)的字段有效
import pandas as pd

data = pd.read_csv("datasets_IMDB-Movie-Data.csv")
print(data.info())

输出

pandas上
可以看到,数据公有12个字段,前10个字段都有1000个数据,最后两个不到1000,因此最后两个字段有缺失。

(3)通过位置取切片、值

a 取行(不要求掌握)

pandas上

; b 取列

方括号里面是字段

pandas上
pandas上
取DataFrame的一列,若是一对方括号,则其类型是Series,若是两对方括号,则其类型为DataFrame
pandas上

c 取值(不要求掌握)

pandas上

; (4)通过df.loc和df.iloc取切片和值

a df.loc 通过标签索引取数据

df.loc[行标签,列标签]

pandas上
pandas上
取某个具体位置的值,结果可能是字符串型,也可能是numpy的数值型

; b df.iloc 通过位置获取行数据

pandas上

pandas上
同df.loc相似,切片也是闭合型的。
如果取行,则t.iloc[2:,],列位置处的冒号可以省略,但如果取列,那么行位置处的冒号不能省略
pandas上
pandas上
无论df.loc还是df.iloc,取某个具体位置的值,结果可能是字符串型,也可能是numpy的数值型,去某一行或某一列,则是Series对象,取不同行列的多个值,则是DataFrame对象。

(5)DataFrame的值的修改

pandas上

可以直接对pandas的某个元素直接复制np.nan,如果是numpy对象,则需要先该数据类型为浮点型

; (5)DataFrame字符串方法

pandas上
先将DataFrame对象中的字符串列筛选出来,然后 .str.方法名(…),返回的结果是Series。
例如
import pandas as pd
import numpy as np
df = pd.read_csv("./dogNames2.csv")
print(df.head(10))
print(50*'*')
df2 = df["Row_Labels"].str.lower()

print(df2.head(10))

输出

  Row_Labels  Count_AnimalName
0      RENNY                 1
1     DEEDEE                 2
2  GLADIATOR                 1
3     NESTLE                 1
4       NYKE                 1
5  BABY GIRL                 3
6      EVVIE                 1
7    AMADEUS                 1
8     FINLEY                 4
9       C.C.                 1
**************************************************
0        renny
1       deedee
2    gladiator
3       nestle
4         nyke
5    baby girl
6        evvie
7      amadeus
8       finley
9         c.c.

Name: Row_Labels, dtype: object

(7)缺失数据处理

a 判断数据是否为NaN:pd.isnull(df),pd.notnull(df)

pandas上

; b NaN的处理

处理方式1:删除NaN所在的行列dropna (axis=0, inplace=False),inplace表示原地修改,不生成新对象

t = pd.DataFrame({'T':[0, 4, 8], 'X':[1.0, 5.0, np.nan], 'Y':[2, 6, 10], 'Z':[3.0, np.nan, 11.0]})

pandas上
如果不加参数,则删除NaN所在的行
pandas上

处理方式2:填充数据,t.fillna(t.mean()),填充均值,t.fillna(t.median()),填充中位数,t.fillna(0)填充0

t.mean(),t.median()是对列求均值和中位数,是除NaN之外的值的均值和中位数

pandas上
pandas上

(8)布尔索引

回到之前狗的名字的问题上,假如我们想找到所有的使用次数超过700并且名字的字符串的长度大于4的狗的名字,应该怎么选择?
直接在中括号中添加条件,&表示且,|表示或

pandas上
例如
import pandas as pd
import numpy as np

file_path = "datasets_IMDB-Movie-Data.csv"
df = pd.read_csv(file_path)

print(df["Year"]==2015)

输出

0      False
1      False
2      False
3      False
4      False
       ...

995     True
996    False
997    False
998    False
999    False
Name: Year, Length: 1000, dtype: bool

df[“Year”]==2015返回的是一个以逻辑值构成的Series对象。
中括号里如果是由逻辑值组成的Series对象,那么就是对行进行筛选

pandas上
但中括号里不能直接用逻辑值,而是应该用Series对象,否则会报错
pandas上

(9)排序

df.sort_values(by="Count_AnimalName",ascending=True)

不止DataFrame,Series对象也能调用这个方法,Series调用这个方法时不需要by
Count_AnimalName是排序所依据的字段
ascending表示是否升序,默认为True

(10)常用统计方法

除了刚刚介绍的df.mean(),df.median(),还有df.max(),df.min(),同样是统计每个字段的

pandas上
还可以使用df.idxmax和df.idxmin返回最大最小值所在的行索引
pandas上
df.idxmax和df.idxmin返回的是Series对象
pandas上
老版本的pandas是通过ser.argmax和ser.argmin来实现这种功能,但是这两种方法只能被Series对象调用,不能被DataFrame对象调用,即必须先对DataFrame对象先去行或列。

; (11)apply与applymap

pandas上
pandas上
pandas上

(12)练习

假设现在我们有一组从2006年到2016年1000部最流行的电影数据,我们想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么获取?

import pandas as pd
import numpy as np

file_path = "datasets_IMDB-Movie-Data.csv"
df = pd.read_csv(file_path)

print(df.head(1))
print(80 * '*')

print(df["Rating"].mean())
print(80 * '*')

print(len(set(df["Director"].tolist())))

输出

   Rank                    Title  ... Revenue (Millions) Metascore
0     1  Guardians of the Galaxy  ...             333.13      76.0

[1 rows x 12 columns]
********************************************************************************
6.723199999999999
********************************************************************************
644

假如要统计这1000部电影的参演演员总数,则代码为

import pandas as pd

file_path = "datasets_IMDB-Movie-Data.csv"
df = pd.read_csv(file_path)

temp_actors_list = df["Actors"].str.split(", ").tolist()
actors_list = [i for j in temp_actors_list for i in j]

actors_num = len(set(actors_list))

print(actors_num)

输出

2015

actors_list = [i for j in temp_actors_list for i in j]可能比较难读懂,这是两个循环嵌套,看下面代码的注释,就能明白

import pandas as pd

file_path = "datasets_IMDB-Movie-Data.csv"
df = pd.read_csv(file_path)

print(df["Actors"].str.split(", "))
print(80 * '*')
print(type(df["Actors"].str.split(", ")))
print(80 * '*')

temp_actors_list = df["Actors"].str.split(", ").tolist()

actors_list = [i for j in temp_actors_list for i in j]

actors_num = len(set(actors_list))

print(actors_num)

输出:

0      [Chris Pratt, Vin Diesel, Bradley Cooper, Zoe ...

1      [Noomi Rapace, Logan Marshall-Green, Michael F...

2      [James McAvoy, Anya Taylor-Joy, Haley Lu Richa...

3      [Matthew McConaughey,Reese Witherspoon, Seth M...

4      [Will Smith, Jared Leto, Margot Robbie, Viola ...

                             ...

995    [Chiwetel Ejiofor, Nicole Kidman, Julia Robert...

996    [Lauren German, Heather Matarazzo, Bijou Phill...

997    [Robert Hoffman, Briana Evigan, Cassie Ventura...

998    [Adam Pally, T.J. Miller, Thomas Middleditch,S...

999    [Kevin Spacey, Jennifer Garner, Robbie Amell,C...

Name: Actors, Length: 1000, dtype: object
********************************************************************************
<class 'pandas.core.series.Series'>
********************************************************************************
2015

Original: https://blog.csdn.net/weixin_44457930/article/details/114707669
Author: weixin_44457930
Title: pandas上

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/753483/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球