自然科学数据库-pandas的相关操作

一.pandas

1.什么是pandas?

pandas 是基于NumPy 的一种工具,该工具是为解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。

2.pandas的常用数据类型

(1).Series 一维,带标签数组

(2).DataFrame 二维,Series容器

3.pandasSeries创建   

(1).通过列表建立serise   eg:Day_04_mydata_01

          pd.Series(可迭代对象,index=())

          string.ascii_uppercase[从A开始:所需要表示的字母个数]     #使用这个方法可以产生字母迭代对象

import pandas as pd
import string
import numpy as np

t=pd.Series(np.arange(1,16),index=list(string.ascii_uppercase[:15]))   #给对应的数组增加相对应的索引
print(t)
A     1
B     2
C     3
D     4
E     5
F     6
G     7
H     8
I     9
J    10
K    11
L    12
M    13
N    14
O    15
dtype: int32

(2).通过字典建立series   eg:Day_04_mydata_02

          pd.Series(a)   #直接将字典放入即可,如果索引和内容对不上则显示nan

import pandas as pd
import numpy as np
import string

a={string.ascii_uppercase[i]:i for i in range(0,10)}
print("字典a:",a)
t1=pd.Series(a)  #通过字典来创建一个series,其中索引就是字典的键
print(t1)
t2=pd.Series(a,index=list(string.ascii_uppercase[5:15]))
print(t2)
字典a: {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9}
A    0
B    1
C    2
D    3
E    4
F    5
G    6
H    7
I    8
J    9
dtype: int64
F    5.0
G    6.0
H    7.0
I    8.0
J    9.0
K    NaN
L    NaN
M    NaN
N    NaN
O    NaN
dtype: float64

4.pandasSeries切片和索引   eg:Day_04_mydata_03

切片:直接设置start、end、step即可

索引:一个的时候直接设置序号或索引,多个可以采用列表进行设置

import pandas as pd
import numpy as np
import string

a={string.ascii_uppercase[i]:i for i in range(0,10)}
print("字典a:",a)
t1=pd.Series(a)  #通过字典来创建一个series,其中索引就是字典的键

print("切片:",t1[2:10:2])
print(t1[1])
print("通过序号索引:",t1[[2,3,6]])
print("布尔索引:",t1[t1>5])
print("通过索引进行索引:",t1["A"])
print("多个索引进行索引:",t1[["A",'B','G','F']])
字典a: {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9}
切片: C    2
E    4
G    6
I    8
dtype: int64
1
通过序号索引: C    2
D    3
G    6
dtype: int64
布尔索引: G    6
H    7
I    8
J    9
dtype: int64
通过索引进行索引: 0
多个索引进行索引: A    0
B    1
G    6
F    5
dtype: int64

5.series 本质上由两个数组组成    eg:Day_04_mydata_04

ndarray的很多方法可以用在series中。

import pandas as pd
import numpy as np
import string

a={string.ascii_uppercase[i]:i for i in range(0,10)}
print("字典a:",a)
t1=pd.Series(a)  #通过字典来创建一个series,其中索引就是字典的键

print("t1的索引:",t1.index)
print("t1的值:",t1.values)
print(type(t1.index))
print(type(t1.values))
字典a: {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9}
t1的索引: Index(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], dtype='object')
t1的值: [0 1 2 3 4 5 6 7 8 9]
<class 'pandas.core.indexes.base.Index'>
<class 'numpy.ndarray'>

6.pandasDataFrame

pandas之读取外部数据:pd. read_csv

(1)DataFrame对象既有行索引,又有列索引

行索引,表明不同行,横向索引,叫index0轴,axis=0

列索引,表名不同列,纵向索引,叫columns1轴,axis=1

(2)DataFrame的相关属性

  • 设置行和列的索引    eg:Day_04_mydata_05

index=。。。;colums=。。。

import pandas as pd
import numpy as np
import string

t1=pd.DataFrame(np.arange(24).reshape(4,6))
print(t1)
t1=pd.DataFrame(np.arange(24).reshape(4,6),index=list(string.ascii_uppercase[0:4]),columns=list(string.ascii_uppercase[-6:]))
print(t1)
    0   1   2   3   4   5
0   0   1   2   3   4   5
1   6   7   8   9  10  11
2  12  13  14  15  16  17
3  18  19  20  21  22  23
    U   V   W   X   Y   Z
A   0   1   2   3   4   5
B   6   7   8   9  10  11
C  12  13  14  15  16  17
D  18  19  20  21  22  23
  • DataFrame的相关属性   eg:Day_04_mydata_06

   

import pandas as pd
import numpy as np
import string

data_list=pd.read_csv("./dogNames2.csv")    #读出csv文件
print(data_list)
df=data_list.sort_values(by="Count_AnimalName",ascending=False)    #ascending标识为false则为降序,此处不需要有引号
print(df.head(5))   #显示前五条数据

print(data_list.shape)
print(data_list.dtypes)
print(data_list.ndim)
print(data_list.index)
print(data_list.columns)
print(data_list.info())    #此处info()要加括号表示一个方法
print(data_list.describe())
   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]
     Row_Labels  Count_AnimalName
858       BELLA               112
4134        MAX                82
3273       LUCY                82
843       BUDDY                79
433       SADIE                77
(4164, 2)
Row_Labels          object
Count_AnimalName     int64
dtype: object
2
RangeIndex(start=0, stop=4164, step=1)
Index(['Row_Labels', 'Count_AnimalName'], dtype='object')
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4164 entries, 0 to 4163
Data columns (total 2 columns):
 #   Column            Non-Null Count  Dtype 
---  ------            --------------  ----- 
 0   Row_Labels        4164 non-null   object
 1   Count_AnimalName  4164 non-null   int64 
dtypes: int64(1), object(1)
memory usage: 65.2+ KB
None
       Count_AnimalName
count       4164.000000
mean           2.643372
std            5.836910
min            1.000000
25%            1.000000
50%            1.000000
75%            2.000000
max          112.000000

7.pandas之取行或者列

  • pandas之loc:df.loc 通过标签索引行数据   eg:Day_04_mydata_07
import pandas as pd
import numpy as np
import string

t1=pd.DataFrame(np.arange(1,25).reshape(4,6),index=list(string.ascii_uppercase[0:4]),columns=list(string.ascii_uppercase[-6:]))
print(t1)
print("*"*100)
print(t1.loc["A","W"] )#此处索引需要使用列表的括号进行索引
print("*"*100)
print(t1.loc["A",["U","X","Z"]])
print(type(t1.loc["A",["U","X","Z"]]))
print("*"*100)
print(t1.loc[["A","C"],["U","X",'Y']])
print("*"*100)
print(t1.loc["A":,["U","X","Z"]])     #在loc索引中,冒号是闭合的,即可以取到冒号后面的元素
   U   V   W   X   Y   Z
A   1   2   3   4   5   6
B   7   8   9  10  11  12
C  13  14  15  16  17  18
D  19  20  21  22  23  24
****************************************************************************************************
3
****************************************************************************************************
U    1
X    4
Z    6
Name: A, dtype: int32
<class 'pandas.core.series.Series'>
****************************************************************************************************
    U   X   Y
A   1   4   5
C  13  16  17
****************************************************************************************************
    U   X   Z
A   1   4   6
B   7  10  12
C  13  16  18
D  19  22  24

 

  • pandas之iloc   eg:Day_04_mydata_08
import pandas as pd
import numpy as np
import string

t1=pd.DataFrame(np.arange(1,25).reshape(4,6),index=list(string.ascii_uppercase[0:4]),columns=list(string.ascii_uppercase[-6:]))
print(t1)
print(t1.iloc[1,3])    #选中一个元素
print("*"*10)
print(t1.iloc[1:3,4])
print("*"*10)
print(t1.iloc[[0,3],[1,4]])
    U   V   W   X   Y   Z
A   1   2   3   4   5   6
B   7   8   9  10  11  12
C  13  14  15  16  17  18
D  19  20  21  22  23  24
10
**********
B    11
C    17
Name: Y, dtype: int32
**********
    V   Y
A   2   5
D  20  23

 

  • pandas之布尔索引   eg:Day_04_mydata_09

假如我们想找到所有的使用次数超过50的狗的名字,应该怎么选择?通过布尔索引可以选择需要的特定元素。

import pandas as pd
import numpy as np
import string

data_list=pd.read_csv("./dogNames2.csv")
print(data_list[data_list["Count_AnimalName"]>50])    #通过data_list进行两次索引
print(data_list[data_list["Count_AnimalName"]>50]&data_list[data_list["Row_Labels"].str.len()>4])
#使用str的len方法来计算字符串长度

回到之前狗的名字的问题上,假如我们想找到所有的使用次数超过50并且名字的字符串的长度大于4的狗的名字,应该怎么选择? 

import pandas as pd
import numpy as np
import string

data_list=pd.read_csv("./dogNames2.csv")
print(data_list[data_list["Count_AnimalName"]>50])    #通过data_list进行两次索引
#print(data_list[(data_list["Count_AnimalName"]>50)&(data_list["Row_Labels"].str.len()>4]))
print(data_list[(data_list["Count_AnimalName"]>50)&(data_list["Row_Labels"].str.len()>4)])
#使用str的len方法来计算字符串长度
 Row_Labels  Count_AnimalName
208      BAILEY                58
335       DAISY                66
433       SADIE                77
843       BUDDY                79
858       BELLA               112
1451     GINGER                60
1551      MOLLY                60
3173    CHARLIE                64
3273       LUCY                82
3281       LILY                55
4047       JACK                57
4134        MAX                82
     Row_Labels  Count_AnimalName
208      BAILEY                58
335       DAISY                66
433       SADIE                77
843       BUDDY                79
858       BELLA               112
1451     GINGER                60
1551      MOLLY                60
3173    CHARLIE                64

8.pandas之字符串方法

  

9.缺失数据的处理   eg:Day_04_mydata_10

判断数据是否为NaNpd.isnull(df),pd.notnull(df)

处理方式1:删除NaN所在的行列dropna (axis=0, how='any', inplace=False)

处理方式2:填充数据,t.fillna(t.mean()),t.fiallna(t.median()),t.fillna(0)

处理为0的数据:t[t==0]=np.nan

当然并不是每次为0的数据都需要处理

计算平均值等情况,nan是不参与计算的,但是0

import pandas as pd
import numpy as np
import string

t1=pd.DataFrame(np.arange(1,25).reshape(4,6),index=list(string.ascii_uppercase[0:4]),columns=list(string.ascii_uppercase[-6:]))
print(t1)
print("*"*100)
t1.loc[["C","D"],["U","V"]]=np.nan
print(t1)
print("*"*100)
print(t1[pd.isnull(t1["V"])])
print(t1[pd.notnull(t1["V"])])
print(pd.isnull(t1))
print(pd.notnull(t1))
print("*"*100)
t1.dropna (axis=0, how='any', inplace=False)    #参数为any,则删除带有nan的每一行,参数为all,则山粗和全部时nan的行
t1=t1.fillna(t1.mean())    #将平均值填入到nan处
print(t1)
    U   V   W   X   Y   Z
A   1   2   3   4   5   6
B   7   8   9  10  11  12
C  13  14  15  16  17  18
D  19  20  21  22  23  24
****************************************************************************************************
     U    V   W   X   Y   Z
A  1.0  2.0   3   4   5   6
B  7.0  8.0   9  10  11  12
C  NaN  NaN  15  16  17  18
D  NaN  NaN  21  22  23  24
****************************************************************************************************
    U   V   W   X   Y   Z
C NaN NaN  15  16  17  18
D NaN NaN  21  22  23  24
     U    V  W   X   Y   Z
A  1.0  2.0  3   4   5   6
B  7.0  8.0  9  10  11  12
       U      V      W      X      Y      Z
A  False  False  False  False  False  False
B  False  False  False  False  False  False
C   True   True  False  False  False  False
D   True   True  False  False  False  False
       U      V     W     X     Y     Z
A   True   True  True  True  True  True
B   True   True  True  True  True  True
C  False  False  True  True  True  True
D  False  False  True  True  True  True
****************************************************************************************************
     U    V   W   X   Y   Z
A  1.0  2.0   3   4   5   6
B  7.0  8.0   9  10  11  12
C  4.0  5.0  15  16  17  18
D  4.0  5.0  21  22  23  24

10.pandas常用统计方法     eg:Day_04_mydata_11

import pandas as pd
import numpy as np
import string
data_list=pd.read_csv("./datasets_IMDB-Movie-Data.csv")
#print(data_list)
print(data_list.info())
print(data_list["Rating"].mean())
print(len(set(data_list["Director"].tolist())))     #此处列表也可以进行元素个数统计,但是要计算不重复的元素个数,必须使用元组
print(len(data_list["Director"].unique()))    #使用unique也可以进行不相同数据的统计
#print(len(set(data_list["Actors"].tolist())))   #此处不能直接使用元组转换,需要用spit进行分割,因为一部电影可以有多个演员,但是只有一个导演
actor_list=data_list["Actors"].str.split(",").tolist()
actor_list1=[i for j in actor_list for i in j ]     #进行两次遍历可以将多维列表进行转换成单独列表
actor_num=len(set(actor_list1))    #此处不需要在转换成列表,因为它本身就是列表
print(actor_num)
 #   Column              Non-Null Count  Dtype  
---  ------              --------------  -----  
 0   Rank                1000 non-null   int64  
 1   Title               1000 non-null   object 
 2   Genre               1000 non-null   object 
 3   Description         1000 non-null   object 
 4   Director            1000 non-null   object 
 5   Actors              1000 non-null   object 
 6   Year                1000 non-null   int64  
 7   Runtime (Minutes)   1000 non-null   int64  
 8   Rating              1000 non-null   float64
 9   Votes               1000 non-null   int64  
 10  Revenue (Millions)  872 non-null    float64
 11  Metascore           936 non-null    float64
dtypes: float64(3), int64(4), object(5)
memory usage: 93.9+ KB
None
6.723200000000003
644
644
2394

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值