pandas df中有几个数组_看了不亏,不看后悔:Pandas基础吐血总结

02a4890d4b0be29854c81bbde99099ef.png

学习python,那么绕不过的一个工具就是Pandas,不管你是做数据分析还是爬虫,Pandas都是一个最基础也是最实用的工具。小编在总结各大IT社区相关的帖子和结合自己学习Pandas基本操作、相关知识的基础上,总结了一套自学教程,基本上涵盖了pandas的重点内容,第一部分主要讲Pandas相关的基础操作,快来收藏吧。

399e6f6794577d50e0c4a912cf1be114.png

一、Pandas介绍

pandas 是基于NumPy的一种工具,是NumPy的一个开源 Python库,它被广泛用于快速分析数据,以及数据清洗和准备等工作。Pandas 纳入了大量库和一些标准的数据模型 ,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。

这里简单说一下Numpy和Pandas的区别,Numpy:是数值计算的扩展包,是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,它能高效处理N维数组、复杂函数、线性代数。Panadas:是做数据处理。是python的一个数据分析包。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。

Pandas是python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发team继续开发和维护,属于PyData项目的一部分。Pandas最初被作为金融数据分析工具而开发出来,因此,pandas为时间序列分析提供了很好的支持。 Pandas的名称来自于面板数据(panel data)和python数据分析(data analysis)。panel data是经济学中关于多维数据集的一个术语,在Pandas中也提供了panel的数据类型。

简单地说,你可以把 Pandas 看作是 Python 版的 Excel。Pandas能很好地处理来自各种不同来源的数据,比如 Excel 表格、CSV 文件、SQL 数据库,甚至还能处理存储在网页上的数据。Pandas基于Numpy,常常与Numpy、matplotlib一起使用。Pandas库的两个主要数据结构(数据类型):Series:一维,DataFrame:多维。

Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近。Series如今能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。

Time- Series:以时间为索引的Series。

DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。

Panel :三维的数组,可以理解为DataFrame的容器。

Panel4D:是像Panel一样的4维数据容器。

PanelND:拥有factory集合,可以创建像Panel4D一样N维命名容器的模块。

在开始前我需要强调下,下面的步骤你要亲自跟着敲一遍并在自己的电脑上实践。虽然下面你会遇到很多命令,给了谁都记不住的。但是别怕,也别中途放弃,因为你没必要记住命令,因为当你在后面学习数据分析用的多了,自然就记住了。记不住也没关系,学会在哪查找就可以了。你只需要跟着上面步骤操作下,并理解了每一步是干什么的就可以了。后面遇到要做的事情,忘记了回头查这个手册就可以了。只要中途不放弃,自己实际操作一遍,我保证你可以熟练上手。

二、Pandas概述

因为pandas是python的第三方库所以使用前需要安装一下,直接使用pip install pandas 就会自动安装pandas以及相关组件,但是有的需要在官网pypi上下载,下载完成后将文件夹保存在对应的路径下,安装完成,打开idle就可以导入库。有问题可以上网搜一下解决办法,这里不再赘述。

pandas:https://pypi.org/project/pandas/#files

16ca20cbaeb03f32a2c1911e1b3c1763.png

2.1 导入Pandas

import pandas as pd

2.2读取csv文件,并显示

import pandas as pd                            #导入pands。
 
df = pd.read_csv('F:/data/train.csv')     #一会再讲dataFrame是什么东西。把
print(df)                                 数据从csv当中读进来。                                          

运行结果:

69a1da649164d575f2536956307097db.png

从结果可以看到,把所有内容都显示出来了。

2.3 只显示前面几行

前面的例子可以看到,显示的数据太多了。我们其实就想看看数据长什么样,不需要都列出来。可以使用.head()来显示前几条。

df.head(10) #指定显示前10条数据。如果不写默认显示5条。【例1】

df[:4] #指定显示前4行数据。【例2】

df[2:5] #显示2,3,4三行数据。【例3】

例1:

import pandas as pd
 
df=pd.read_csv('F:/data/train.csv')
print(df.head())

运行结果:

68b57418fe3ec85bd8a1fe43be4f29b8.png

例2:

import pandas as pd
 
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
a = df[:5]
print(a)

运行结果:

0dbc05f65d18d0e6e7ecc3fbc62c8f3f.png

例3:

import pandas as pd
 
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
a = df[2:5]
print(a)

运行结果:

072de77eb0730454ef73ac7e9ef73cc2.png

2.4 看一下df的信息

http://df.info() //返回当前的信息。

【代码】

import pandas as pd
df=pd.read_csv('F:/data/train.csv')
print(df.info())

运行结果:

<class 'pandas.core.frame.DataFrame'> #df是DataFrame结构。这是pandas最核心的结构。

RangeIndex: 891 entries, 0 to 890 #当前索引一共891个。从0到890。

Data columns (total 12 columns): #当前数据一共12列。下面分别打出每一列的信息。

PassengerId 891 non-null int64 #第一列叫PassengerId。有891个值。

Survived 891 non-null int64

Pclass 891 non-null int64

Name 891 non-null object #object类型就是String类型的串。串在pandas中是

object类型。

Sex 891 non-null object

Age 714 non-null float64

SibSp 891 non-null int64

Parch 891 non-null int64

Ticket 891 non-null object

Fare 891 non-null float64

Cabin 204 non-null object

Embarked 889 non-null object

dtypes: float64(2), int64(5), object(5)

memory usage: 83.6+ KB #当前占多少内存。

None

2.5 看一下df的索引

import pandas as pd
 
df=pd.read_csv('F:/data/train.csv')
print(df.index)

运行结果:

RangeIndex(start=0, stop=891, step=1)

2.6 看一下df的列名(列名就是数据表中的第一行)

import pandas as pd
 
df=pd.read_csv('F:/data/train.csv')
print(df.columns)

运行结果:

Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',

'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],

dtype='object')

2.7:看一下每一列的类型

import pandas as pd
 
df=pd.read_csv('F:/data/train.csv')
print(df.dtypes)

运行结果:

PassengerId int64

Survived int64

Pclass int64

Name object

Sex object

Age float64

SibSp int64

Parch int64

Ticket object

Fare float64

Cabin object

Embarked object

dtype: object

2.8 看一下df的数值

import pandas as pd
 
df=pd.read_csv('F:/data/train.csv')
print(df.values)

运行结果:

[[1 0 3 ... 7.25 nan 'S']

[2 1 1 ... 71.2833 'C85' 'C']

[3 1 3 ... 7.925 nan 'S']

...

[889 0 3 ... 23.45 nan 'S']

[890 1 1 ... 30.0 'C148' 'C']

[891 0 3 ... 7.75 nan 'Q']]

2.9 自己创建一个DataFarme结构

刚才讲了,怎么读取文件,然后看一下文件的信息。那能不能自己创建一个DataFrame结构呢?可以。

数据要有列名,还有有值。可以通过字典来创建。字典的key代表列名,value代表值。

代码:

import pandas as pd
data = {'country':['aaa','bbb','ccc'],
        'population':[10,12,14]
        }
 
df_data = pd.DataFrame(data)
 
print(df_data)
print()
print(df_data.info())

运行结果:

country population

0 aaa 10

1 bbb 12

2 ccc 14

<class 'pandas.core.frame.DataFrame'>

RangeIndex: 3 entries, 0 to 2

Data columns (total 2 columns):

country 3 non-null object

population 3 non-null int64

dtypes: int64(1), object(1)

memory usage: 128.0+ bytes

None

通过上面的例子,我们可以自己读,也可以创建DataFrame。但一般情况下都是从文件里面读文件。具体怎么得到,看自己的需求。

三、Pandas基本操作

3.1 看DataFrame中某一列的数据

import pandas as pd
 
df = pd.read_csv('F:/data/train.csv')
print(df)
print(df['Age'])                                   #注意要加单引号。

运行结果:

0 22.0

1 38.0

2 26.0

3 35.0

4 35.0

5 NaN

6 54.0

7 2.0

8 27.0

9 14.0

10 4.0

11 58.0

.....

888 NaN

889 26.0

890 32.0

Name: Age, Length: 891, dtype: float64

我们发现第5个为NaN。表示“not a number”,

3.2 单独取的这一列也太多了,只要前几列

import pandas as pd
 
df = pd.read_csv('F:/data/train.csv')
data =df['Age']
print(type(data))                                #是一个Series类型。
print(data[:5])                                  #取0到5(不含)的元素。   

运行结果:

<class 'pandas.core.series.Series'>

0 22.0

1 38.0

2 26.0

3 35.0

4 35.0

Name: Age, dtype: float64

DataFrame中的一行或者一列都可以叫做Series结构。

Series结构也有一些属性,跟DataFrame的差不多。

例1:看一下Series的索引

import pandas as pd
 
df = pd.read_csv('F:/data/train.csv')
age =df['Age']
print(age.index)

运行结果:

RangeIndex(start=0, stop=891, step=1)

例2:看一下Series的值

import pandas as pd
 
df = pd.read_csv('F:/data/train.csv')
age =df['Age']
print(age.values[:6])                            #要加s.

运行结果:

[22. 38. 26. 35. 35. nan] #得到的是一个列表。

3.3 使用DataFrame的某一列作为索引

之前的索引是0,1,2,3...能不能改成Name这一列。即改变索引,用name作为索引。

代码:

import pandas as pd
 
df = pd.read_csv('F:/data/train.csv')      #读文件
df = df.set_index('Name')                  #改成Name用Name做索引
print(df.head())                           #查看前5行数据
print(df['Age'][:5])                       #取“Age”这一列,显示前5行数据。

运行结果:

b809fde63c5bf16006b82acc2a336e6a.png

发现改变索引之后,结果清晰多了。查看Age这一列,也能知道是谁的年龄了。

3.4 Series通过索引找相应的值

import pandas as pd
 
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
age = df['Age']
print(age['Allen, Mr. William Henry'])

运行结果:

35.0

3.5 Series计算

跟Numpy差不多。类似于Numpy的广播的效果,会对每一个值都加上10。

例1:年龄同时加10

import pandas as pd
 
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
age = df['Age']
print(age[:5])
age = age +10
print(age[:5])

运行结果:

be029de31669fb20b807f2a32b1b3ba5.png

例2:求年龄的一些统计值。

import pandas as pd
 
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
age = df['Age']
print(age.mean())                                  #求年龄的平均值。
print(age.max())
print(age.min())
print(age.sum())

运行结果:

29.69911764705882

80.0

0.42

21205.17

3.6 DataFrame的计算

df.sum() #把每一列都求和。【例1】

df.sum()['Age'] #结果等同于 df['Age'].sum()。【例2】

例1:

import pandas as pd
 
df = pd.read_csv('F:/data/train.csv')
print(df.sum())

运行结果:

e50ea205787389146e27736a9ebddfc9.png

例2:

import pandas as pd
df = pd.read_csv('F:/data/train.csv')
print(df.sum()['Age'])

运行结果:

21205.17

3.7 df.describe()统计信息

挨个列统计最大最小值等太麻烦了,可以用df.describe()命令对整个DateFrame进行统计分析。

注意:只统计有数值的这些列。姓名啊之类的列根本就没有统计。

代码:

import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
print(df.describe())

运行结果:

3deeae34955255fa0c70e86db85e4167.png

count //当前这一列有多少个不为空的样本。

其他表示这一列的均值、标准差、最小值、最大值、分位数。

四、Pandas索引

下面来说一下,在pandas当中,怎么对数据进行索引。这个其实跟Numpy差不多。只不过它的用法更为丰富了一些。

4.1 获取多个列

import pandas as pd
 
df = pd.read_csv('F:/data/train.csv')
df = df[['Age','Fare']][:5]#注意两个中括号。要把'Age'和'Fare'作为整体传到df
print(df)

运行结果:

Age Fare

0 22.0 7.2500

1 38.0 71.2833

2 26.0 7.9250

3 35.0 53.1000

4 35.0 8.0500

4.2 DataFrame获取行数据

df['0']/df[0] //错误写法。DataFrame不能通过索引直接取得一行数据。【例1】。需要用到loc和iloc

df.iloc[0] //用位置来定位。【例2】

df.iloc[2:5] //拿到2,3,4三行数据。【例3】

df.iloc[2:5,:3] //切片。要2,3,4行,0,1,2列的数据。【例4】

df.loc['liupc'] //如果之前索引改成了"Name",则要通过loc来取一行。【例5】

df.loc['liupc','Age'] //可以定位到具体的一个值。【例6】

df.loc['liupc':'lijing',:] //从liupc这一行到lijing这一行,所有列的数据。【例7】

df.iloc[0,'Age'] //错误写法。应该是不能混用。要么里面全是数字,要么里面全是字符串

df.loc['Heikkinen, Miss. Laina',2] //错误写法。应该是不能混用。df.iloc[0]['Age'] //正确。这种写法相当于 a=df.iloc[0] b=a['Age']

df.loc['Heikkinen, Miss. Laina','Age'] = 99 //修改值。 【例8】

总结:

loc //如果用标签来做定位,用loc。

iloc //用具体的一个值(一个位置)来定位,用iloc。

ix //有的人还在用df.ix['liupc']这种写法。但是ix要被遗弃了,以后就不要用了。现在只用loc和iloc就行。

没有df['aaa','bbb']这种写法。当作取'aaa'和'bbb'这两列吧,少了中括号。当作取'aaa'行'bbb'列吧,前面没有loc。所以压根就没有这种写法。

例1:不能通过索引,直接获取DataFrame的行。

import pandas as pd
df = pd.read_csv('F:/data/train.csv')
print(df[0])

运行结果:

KeyError: 0

例2:拿一行数据

import pandas as pd
 
df = pd.read_csv('F:/data/train.csv')
print(df.iloc[0])                            #使用iloc(),通过位置来定位

运行结果:

a48a960a8c4d271e72be23e5add87153.png

例3:拿多行数据

import pandas as pd
df = pd.read_csv('F:/data/train.csv')
print(df.iloc[2:5])                                        #拿3行数据

运行结果:

19db5d88f7f4be216a3a6ed0abd039b1.png

例4:不光拿行,还筛选列

import pandas as pd
df = pd.read_csv('F:/data/train.csv')
print(df.iloc[2:5,:2])

运行结果:

bfffc0100614c4289ac2ed9e4cd4343d.png

例5:

import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df =df.set_index('Name')                                 #改变索引
print(df.loc['Allen, Mr. William Henry'])                #通过loc来获取

运行结果:

6bd351ef8eb150fe4e99539fa67deaae.png

例6:定位到具体的一个值

import pandas as pd
 
df = pd.read_csv('F:/data/train.csv')
df =df.set_index('Name')
print(df.loc['Allen, Mr. William Henry','Age'])

运行结果:

35.0

例7:

import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df =df.set_index('Name')
print(df.loc['Heikkinen, Miss. Laina':'Allen, Mr. William Henry',:])   

运行结果:

425b590827d3cbb6d1120eda54c6cdbb.png

例8:

import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
print(df.loc['Heikkinen, Miss. Laina','Age']);
df.loc['Heikkinen, Miss. Laina','Age']=100
print(df.loc['Heikkinen, Miss. Laina','Age']);

运行结果:

26.0

100.0

4.3:bool类型的索引

df[df['Age']>40] #首先,df['Age']>40得到的是一串True或者False。这个本身就是索引【例1】

#然后,把这个索引传给df,可以筛选出Age>40的那些行【例2】

df[df['Sex']=='male'] #取出男性【例3】

df.loc[df['Sex']=='male','Age'].mean() #可以统计部分数据。男性,对Age这一列求平均值【例4】

#也可以写:df.loc[df['Sex']=='male','Age'].mean()

#不能写:df[df['Sex']=='male','Age'].mean()

(df['Age']>70).sum() #年龄大于70的有多少人【例5】

例1:

import pandas as pd
 
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
print(df['Age']>40)

运行结果:

2b100c26f9a8ec1b18b937051a63672b.png

例2:

import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
a = df[df['Age']>40]
print(type(a))                                   #还是一个DataFrame类型。
b=a['Age'][:10]                                  #去Age这一列,前10行。
print(b)                                         #相当于print(df[df['Age']>40]['Age'][:10])

运行结果:

9c7b1b8e1ee4df10b9b65eaac141c4dd.png

可以看到a的年龄都大于40。

例3:取出男性

import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')              #修改索引 
a = df[df['Sex']=='male'][:10]         #使用boolean索引取出男性,要前十行。
print(a)

运行结果:

40203db3100090ff1e0c306143f17f82.png

例4:

import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
a = df.loc[df['Sex']=='male','Age'].mean()
print(a)

运行结果:

30.72664459161148

例5:

import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
a = (df['Age']>70).sum()                          #统计年龄大于70的人数
print(a)
b=df[df['Age']>70]['Age']
print(b)

运行结果:

b4587cc74e18d5d1b51432a0316d388e.png

五、groupby 操作

pandas提供了一个灵活高效的groupby功能,它使你能一种自然地方式对数据集进行切片,切换,摘要等操作。根据一个或者多个键(可以是函数可以是数组或者DataFrame列名)拆分pandas对象。计算分组摘要统计,如计数、平均数、标准差、或者用户自定义的函数。

5.1 求A、B、C的data的平均值

5.1.1 数据准备

首先定义一个DataFrame,作为例子。

import pandas as pd
df =pd.DataFrame({'Label':['A','B','C','A','B','C','A','B','C'],
                           'data':[5,10,15,20,10,0,25,10,10]})
print(df)

运行结果:

43cc1cc31a59146c65203c01a999e3f2.png

5.1.2 如果使用程序实现

import pandas as pd
 
df =pd.DataFrame({'Label':['A','B','C','A','B','C','A','B','C'],
                  'data':[5,10,15,20,10,0,25,10,10]})
 
for data in ['A','B','C']:
    print(data+"  ",end="")
    print(df.loc[df['Label']==data,'data'].sum())

运行结果:

A 50

B 30

C 25

但是这样比较麻烦。可以直接用groupby函数。

5.1.3 使用group函数求A、B、C的data的平均值

import pandas as pd
 
df =pd.DataFrame({'Label':['A','B','C','A','B','C','A','B','C'],
                  'data':[5,10,15,20,10,0,25,10,10]})
 
result=df.groupby('Label').sum()  
print(result)

运行结果:

9ffd85fe9f6d112b4ba33157bf5f4ca2.png

5.2 groupby结合numpy的函数

import numpy as np
import pandas as pd
 
df =pd.DataFrame({'Label':['A','B','C','A','B','C','A','B','C'],
                            'data':[5,10,15,20,10,0,25,10,10]})
 
result=df.groupby('Label').aggregate(np.sum)         #调用numpy的函数。
print(result)

运行结果:

e5b23118258b7c7b335eadc4e0f97ea0.png

5.3 计算泰坦尼克数据集中男女的平均年龄

import numpy as np
import pandas as pd
 
df = pd.read_csv('F:/data/train.csv')
result = df.groupby('Sex')['Age'].mean()
                                    #先对性别做分组,然后取出Age列,求平均。
print(result)

运行结果:

aa0bd7a1229249aa7117eb901ee2ea5e.png

5.4 计算泰坦尼克上男女获救的概率

import numpy as np
import pandas as pd
 
df = pd.read_csv('F:/data/train.csv')
result = df.groupby('Sex')['Survived'].mean()
print(result)

运行结果:

2dc17b3e929e7522c333b2c3e72ce566.png

发现女的有74%的概率获救了,男的只有18.9%的人被救了。

六、pandas库的基础进阶

本章将会详细讲Series和DataFrame,这里先运行两个代码,看一下基本操作。

Series的创建(使用Python的列表创建Series):

import numpy as np
import pandas as pd
 
# 使用list创建
s1 = pd.Series([1,2,3,4]) # 可以发现索引index默认从0开始进行自动索引
s1
0    1
1    2
2    3
3    4
dtype: int64
 
# 值属性,可以方便查看Series的值
s1.values
array([1, 2, 3, 4], dtype=int64)
 
# 索引index属性,返回的是索引从开始到结束和间隔的值
s1.index 
RangeIndex(start=0, stop=4, step=1)
 
# 使用numpy的数组进行创建
s2 = pd.Series(np.arange(10))
s2
0    0
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
dtype: int32
 
# 通过字典进行创建
s3 = pd.Series({'1':1, '2':2, '3':3})
s3
1    1
2    2
3    3
dtype: int64
 
s3.values
array([1, 2, 3], dtype=int64)
 
s3.index
Index(['1', '2', '3'], dtype='object')
 
# 手动赋值索引
s4 = pd.Series([1,2,3,4], index=['A','B','C','D'])
s4
A    1
B    2
C    3
D    4
dtype: int64
 
s4.values
array([1, 2, 3, 4], dtype=int64)
s4.index
Index(['A', 'B', 'C', 'D'], dtype='object')
s4['A']  # 根据索引取值
1
s4[s4>1] # 根据值得范围取值
B    2
C    3
D    4
dtype: int64
 
s4.to_dict() 
# 把Series转换为字典输出,也就是说可以通过字典创建Series,也可以通过Series转换为字典
{'A': 1, 'B': 2, 'C': 3, 'D': 4}
 
s5 = pd.Series(s4.to_dict()) # 来回转
s5
A    1
B    2
C    3
D    4
dtype: int64
 
index_1 = ['A','B','C','D','E'] 
# 可单独把索引写出,再赋值给Series,同时多增加一个索引
s6 = pd.Series(s5, index=index_1)
s6  # 多增加的索引的值为NAN
A    1.0
B    2.0
C    3.0
D    4.0
E    NaN
dtype: float64
 
pd.isnull(s6)
 # 根据pd.isnall()判断Series的元素是否有空值,如果有返回Ture,反之False
A    False
B    False
C    False
D    False
E     True
dtype: bool
 
pd.notnull(s6) # 类似的操作 
A     True
B     True
C     True
D     True
E    False
dtype: bool
 
s6.name = 'demo' # 给Series赋予名字
s6
A    1.0
B    2.0
C    3.0
D    4.0
E    NaN
Name: demo, dtype: float64
 
s6.index.name = 'demo_index' # 给索引起个名字
s6
demo_index
A    1.0
B    2.0
C    3.0
D    4.0
E    NaN
Name: demo, dtype: float64
 
s6.index 
Index(['A', 'B', 'C', 'D', 'E'], dtype='object', name='demo_index')

Dataframe的创建(使用Python的列表创建Dataframe)

pandas的Dataframe学习
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
 
import webbrowser
link = 'https://www.tiobe.com//tiobe-index/'
webbrowser.open(link)
True
 
df = pd.read_clipboard() # 读取粘贴板的内容
df
Sep	2018	Sep.1	2017	Change	Programming	Language	Ratings	Change.1
0	0	1	1	NaN	Java	17.436%	+4.75%	NaN	NaN
1	1	2	2	NaN	C	15.447%	+8.06%	NaN	NaN
2	2	3	5	change	Python	7.653%	+4.67%	NaN	NaN
3	3	4	3	change	C++	7.394%	+1.83%	NaN	NaN
4	4	5	8	change	Visual	Basic	.NET	5.308%	+3.33%
5	5	6	4	change	C#	3.295%	-1.48%	NaN	NaN
6	6	7	6	change	PHP	2.775%	+0.57%	NaN	NaN
7	7	8	7	change	JavaScript	2.131%	+0.11%	NaN	NaN
8	8	9	-	change	SQL	2.062%	+2.06%	NaN	NaN
9	9	10	18	change	Objective-C	1.509%	+0.00%	NaN	NaN
 
type(df)
pandas.core.frame.DataFrame
 
df.columns # 读取索引,该操作作用很大,可以读取行的索引,以此可以通过该索引进行访问
Index(['Sep', '2018', 'Sep.1', '2017', 'Change', 'Programming', 'Language',
       'Ratings', 'Change.1'],
      dtype='object')
 
df.Ratings # 通过标签读取该列内容
0    17.436%
1    15.447%
2     7.653%
3     7.394%
4     5.308%
5     3.295%
6     2.775%
7     2.131%
8     2.062%
9     1.509%
Name: Ratings, dtype: object
 
# 从原先的dataframe中提取想要的数据,并赋给新的dataframe,该操作很有用
df_new = DataFrame(df, columns=['Sep 2019','Sep 2018', 'Change', 'Programming Language'])
# 同时增加新的标签,并自动赋值nan
df_new
Sep 2019	Sep 2018	Change	Programming Language
0	NaN	1	NaN	Java
1	NaN	2	NaN	C
2	NaN	3	change	Python
3	NaN	4	change	C++
4	NaN	5	change	Visual Basic .NET
5	NaN	6	change	C#
6	NaN	7	change	PHP
7	NaN	8	change	JavaScript
8	NaN	9	change	SQL
9	NaN	10	change	Objective-C
 
df_new['Sep 2019'] = range(10) # 给新的列标签赋值
type(df['Sep 2018'])
pandas.core.series.Series
df_new
Sep 2019	Sep 2018	Change	Programming Language
0	0	1	NaN	Java
1	1	2	NaN	C
2	2	3	change	Python
3	3	4	change	C++
4	4	5	change	Visual Basic .NET
5	5	6	change	C#
6	6	7	change	PHP
7	7	8	change	JavaScript
8	8	9	change	SQL
9	9	10	change	Objective-C

6.1 创建一个Series

6.1.1 pd.Series(data,index)

// data参数可以是任意数据对象,比如字典、列表甚至是 NumPy 数组。【例1、3、4、5】

// index参数则是对 data 的索引值,类似字典的 key。若index省略,则为0,1,2,...。【例2】

//能存放各种不同类型的对象。【例6】

1. pd.Series([4,5,6,7],['aaa','bbb','ccc','ddd']) //通过列表创建。【例1】

2. pd.Series([4,5,6,7]) //index省略,则为0,1,2,...。【例2】

3. pd.Series(range(2,6,2)) //通过range函数创建。range()返回的是一系列数。【例3】

4. pd.Series(np.array([5,6,7,8])) //从numpy数组创建。【例4】

5. pd.Series({'a':30,'b':40,'c':50,'d':60}) //通过字典创建。键当做index,值当做data【例5】

6. pd.Series(25,['zhang','liu','li']) //从标量值创建。【例6】

7. pd.Series({4,5,True,'aaa'}) //可以存放不同类型的对象。【例7】

例1:通过列表创建Series

import numpy as np
import pandas as pd
data=[4,5,6,7]
index =['aaa','bbb','ddc','ddd']
a=pd.Series(data,index)                    
print(a)

运行结果:

aaa 4

bbb 5

ccc 6

ddd 7

dtype: int64

例2:省略index

import numpy as np
import pandas as pd
data=[4,5,6,7]
a=pd.Series(data)
print(a)

运行结果:

0 4

1 5

2 6

3 7

dtype: int64

例3:通过range()函数创建

import numpy as np
import pandas as pd
my_range=range(2,6,2)                            #从2到6,不含6,步长为2。
a=pd.Series(my_range)
print(a)

运行结果:

0 2

1 4

dtype: int64

例4:通过numpy数组创建

import numpy as np
import pandas as pd
data =np.array([5,6,7,8])
a=pd.Series(data)
print(a)

运行结果:

0 5

1 6

2 7

3 8

dtype: int32

例5:通过字典创建

import numpy as np
import pandas as pd
my_dict = {'a':30,'b':40,'c':50,'d':80}
a=pd.Series(my_dict)
print(a)

运行结果:

a 30

b 40

c 50

d 80

dtype: int64

例6:从标量值创建

import numpy as np
import pandas as pd
a=pd.Series(25,['zhang','liu','wei','wang'])
print(a)

运行结果:

zhang 25

liu 25

wei 25

wang 25

例7:可以存放不同类型的对象

import numpy as np
import pandas as pd
list =[1,3,'aaa',True]
a=pd.Series(list)
print(a)

运行结果:

0 1

1 3

2 aaa

3 True

dtype: object

6.1.2 从Series对象中获取数据

my_series['liu'] //和python字典基本一样。

例:

import numpy as np
import pandas as pd
 
list =[1,3,'aaa',True]
a=pd.Series(list)
print(a[2])                                                    #aaa
b=pd.Series([2,3,4,5],['liu','li','guo','wang'])       
print(b['li'])                                                 #3

6.1.3 算术运算

对 Series 的算术运算都是基于 index 进行的。我们可以用加减乘除(+ - * /)这样的运算符对两个 Series 进行运算,Pandas 将会根据索引 index,对响应的数据进行计算,结果将会以浮点数的形式存储,以避免丢失精度。如果 Pandas 在两个 Series 里找不到相同的 index,对应的位置就返回一个空值 NaN。

例:

import numpy as np
import pandas as pd
 
a=pd.Series([1,4,2,5],['zhang','liu','wei','wang'])
b=pd.Series([2,3,4,5],['liu','li','guo','wang'])
 
print(a+b)
print()
print(a-b)
print()
print(a*b)
print()
print(a/b)

运行结果:

guo NaN

li NaN

liu 6.0

wang 10.0

wei NaN

zhang NaN

dtype: float64

guo NaN

li NaN

liu 2.0

wang 0.0

wei NaN

zhang NaN

dtype: float64

guo NaN

li NaN

liu 8.0

wang 25.0

wei NaN

zhang NaN

dtype: float64

guo NaN

li NaN

liu 2.0

wang 1.0

wei NaN

zhang NaN

dtype: float64

6.2、DataFrame

6.2.1 创建DataFrame

   data={'name':['li','liu','wang','zhang'],
               'age':[22,23,24,25],
               'class':[1,2,3,4]
             }
    frame=pd.DataFrame(data,index=['a','b','c','d'])     
 //通过字典创建。若index省略,则为0,1,2,...【例1】

例1:

import numpy as np
import pandas as pd


data={'name':['li','liu','wang','zhang'],
           'age':[22,23,24,25],
           'class':[1,2,3,4]
          }
frame=pd.DataFrame(data)
print(frame)

运行结果:

name age class

0 li 22 1

1 liu 23 2

2 wang 24 3

3 zhang 25 4

6.2.2 获取元素

my_df['name'] //获取一列。返回的就是一个 Series。【例1】

my_df[['name','class']] //获取多列。返回的是一个DataFrame。注意两个中括号。【例2】

例1:

import numpy as np
import pandas as pd
data={'name':['li','liu','wang','zhang'],
      'age':[22,23,24,25],
      'class':[1,2,3,4]
      }
my_df=pd.DataFrame(data)
print(my_df)
print()
 
a=my_df['name']                                       #获取一列
print(a)
print(type(my_df['name']))                          #返回的就是一个 Series。

运行结果:

name age class

0 li 22 1

1 liu 23 2

2 wang 24 3

3 zhang 25 4

0 li

1 liu

2 wang

3 zhang

Name: name, dtype: object

<class 'pandas.core.series.Series'>

例2:

import numpy as np
import pandas as pd
 
data={'name':['li','liu','wang','zhang'],
      'age':[22,23,24,25],
      'class':[1,2,3,4]
      }
my_df=pd.DataFrame(data)
print(my_df)
print()
 
a=my_df[['name','class']]                                  #取两列
print(a)
print(type(my_df[['name','class']]))              #返回的是一个DataFrame

运行结果:

name age class

0 li 22 1

1 liu 23 2

2 wang 24 3

3 zhang 25 4

name class

0 li 1

1 liu 2

2 wang 3

3 zhang 4

<class 'pandas.core.frame.DataFrame'>

6.2.3 添加新列

1. my_df['sex']=pd.Seriex(['W','M','W','M'])

#从头开始定义一个 pd.Series,再把它放到表中。【例1】

2. #利用现有的列来产生需要的新列。【例2】

例1:定义sex这一列放到DataFrame中

import numpy as np
import pandas as pd
data={'name':['li','liu','wang','zhang'],
      'age':[22,23,24,25],
      'class':[1,2,3,4]
      }
my_df=pd.DataFrame(data)
print(my_df)
print()
 
my_df['sex']=pd.Series(['W','M','W','M'])
print(my_df)

运行结果:

name age class

0 li 22 1

1 liu 23 2

2 wang 24 3

3 zhang 25 4

name age class sex

0 li 22 1 W

1 liu 23 2 M

2 wang 24 3 W

3 zhang 25 4 M

例2:利用现有的列来产生需要的新列

import numpy as np
import pandas as pd
data={'name':['li','liu','wang','zhang'],
      'age':['22','23','24','25'],    #注意改成了字符串。否则下面的语句报错。
      'class':[1,2,3,4]
      }
my_df=pd.DataFrame(data)
print(my_df)
print()
my_df['id']= my_df['name'] + my_df['age']       
                         #注意name与age列的属性应该相同,都是字符串。
print(my_df)

运行结果:

name age class

0 li 22 1

1 liu 23 2

2 wang 24 3

3 zhang 25 4

name age class id

0 li 22 1 li22

1 liu 23 2 liu23

2 wang 24 3 wang24

3 zhang 25 4 zhang25

QQ群:101 750 3955,免费领取相关的资料,包括电子版书籍、Python基础教程、Python全栈和数据分析相关的视频资料。在群里一起交流互助,还会定期分享数据竞赛、python公开技术讲座,精彩多多,福利多多。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值