pandas的数据结构主要有两种:series 和 DataFrame
系列(series):是一维数组,与numpy中的一维array类似只允许存储相同的数据类型,这样可以更加有效的使用存储空间,提高运算效率
DataFrame是二维数组,非常接近Excel中的电子表格或者MySQL数据库的形式,ta
的竖行为列(column)横行是index,数据的位置时通过column和index确定的,可以把DataFrame理解为series的容器
目录
一.series
1.创建一个系列series
import pandas as pd
import numpy as np
data = np.array(['a','b','c','d'],dtype=str)
s = pd.Series(data)
print('显示系列中的索引和数据')
print(s)
print()
data = np.arange(4)
t = pd.Series(data,index=['a','b','c','d'])
print('显示系列中的索引和数据')
print(t)
运行结果:
显示系列中的索引和数据
0 a
1 b
2 c
3 d
dtype: object
显示系列中的索引和数据
a 0
b 1
c 2
d 3
dtype: int32
2.从有位置的系列中访问数据
系列中的数据可以使用类似访问ndarray中的数据来访问
import numpy as np
import pandas as pd
print('系列中的索引和数据')
s = pd.Series([100,99,22,44,88],index=['liu','li','huang','du','zhang'])
print(s)
print()
print('系列中的第一个数据:',s[0])
print('系列中的第三个数据',s[2])
print()
print('系列中的前三个数据',s[:3])
print()
print('系列中的后三个数据',s[2:])
运行结果
系列中的索引和数据
liu 100
li 99
huang 22
du 44
zhang 88
dtype: int64
系列中的第一个数据: 100
系列中的第三个数据 22
系列中的前三个数据 liu 100
li 99
huang 22
dtype: int64
系列中的后三个数据 huang 22
du 44
zhang 88
dtype: int64
二.DataFrame
DataFrame是一个表格型的数据结构,它含有一组有序的列,每一列的数据结构都是相同的,而不同的列之间可以是不同的数据结构(数值,字符,布尔值)。或者以数据库进行类比,DataFrame中的每一行都是一个记录,名称为index的一个元素,而每一列为一个字段,是这个记录的一个属性。DataFrame即有行索引也有列索引。
1.简单创建一个DataFrame
import numpy as np
import pandas as pd
d = {'姓名':pd.Series(['小明','小红','小华','小李','小刘','小王','小张','小黄',]),
'性别':pd.Series(['男','女','男','男','男','女','男','女'])
,'年龄':pd.Series(['12','12','14','15','18','18','17','19']),
'成绩':pd.Series(['45','32','43','65','100','77','86','99'])}
df = pd.DataFrame(d)
print(df)
运行结果
姓名 性别 年龄 成绩
0 小明 男 12 45
1 小红 女 12 32
2 小华 男 14 43
3 小李 男 15 65
4 小刘 男 18 100
5 小王 女 18 77
6 小张 男 17 86
7 小黄 女 19 99
2.数据的选择和查看
前面的列子是显示DataFrame中所有的数据,如果只需要显示‘姓名’的信息,应该如何操作?
只要在输出的时候把df改成为df['姓名']就可以了
同理如果要只输出性别可以这样 print(['性别'])
输出姓名和成绩就这样 print([['成绩','姓名']])
如果想要输出特定位置的数据可以这样
df.head(p) p为个数 这条语句的意思是输出df中前p个数据信息 默认是五个
df.tail(p) p为个数 这条语句的意思是输出df中后p个shuj信息 默认是五个
df[n:m] 显示第n+1到第m条的数据信息
import numpy as np
import pandas as pd
d = {'姓名':pd.Series(['小明','小红','小华','小李','小刘','小王','小张','小黄',]),
'性别':pd.Series(['男','女','男','男','男','女','男','女'])
,'年龄':pd.Series(['12','12','14','15','18','18','17','19']),
'成绩':pd.Series(['45','32','43','65','100','77','86','99'])}
df = pd.DataFrame(d)
print('输出姓名')
print(df['姓名'])
print()
print('只输出姓名和成绩')
print(df[['姓名','成绩']])
print()
print('只显示前几条数据信息')
print(df.head(3))
print()
print('只显示后几条数据信息')
print(df.tail())
print()
print('显示中间几条数据信息')
print(df[3:6])
3.条件语句的运用
要显示df中性别是女的数据信息
要显示df中及格的学生
要显示df中及格且性别是男生的学生
import numpy as np
import pandas as pd
d = {'姓名':pd.Series(['小明','小红','小华','小李','小刘','小王','小张','小黄',]),
'性别':pd.Series(['男','女','男','男','男','女','男','女'])
,'年龄':pd.Series(['12','12','14','15','18','18','17','19']),
'成绩':pd.Series(['45','32','43','65','100','77','86','99'])}
df = pd.DataFrame(d)
print('显示性别为女的数据信息')
print(df[df['性别'] == '女'])
print()
print('成绩及格的学生')
print(df[df['成绩'] >= '60'])
print()
print('显示性别为男成绩及格的男生')
print(df[(df['性别'] == '男') & (df['成绩'] > '60')])
运行结果
显示性别为女的数据信息
姓名 性别 年龄 成绩
1 小红 女 12 32
5 小王 女 18 77
7 小黄 女 19 99
成绩及格的学生
姓名 性别 年龄 成绩
3 小李 男 15 65
5 小王 女 18 77
6 小张 男 17 86
7 小黄 女 19 99
显示性别为男成绩及格的男生
姓名 性别 年龄 成绩
3 小李 男 15 65
6 小张 男 17 86
4.函数的运用
将介绍下面几种函数
计算总和(sum)平均数(mean)标准偏差(std)max(最大值)min(最小值)
import numpy as np
import pandas as pd
d = {'姓名':pd.Series(['小明','小红','小华','小李','小刘','小王','小张','小黄',]),
'性别':pd.Series(['男','女','男','男','男','女','男','女'])
,'年龄':pd.Series(['12','12','14','15','18','18','17','19']),
'成绩':pd.Series([55,32,43,65,100,77,86,99])}
df = pd.DataFrame(d)
print('所有人成绩的总和是',df['成绩'].sum())
print('平均成绩是',df['成绩'].mean())
print('成绩最高的是',df['成绩'].max())
print('所有人成绩的标准偏差是',df['成绩'].std())
运行结果
所有人成绩的总和是 557
平均成绩是 69.625
成绩最高的是 100
所有人成绩的标准偏差是 25.263963607139264
5.分组的运用
进行分组需要用到groupby函数
下面以对df的性别为列
import numpy as np
import pandas as pd
d = {'姓名':pd.Series(['小明','小红','小华','小李','小刘','小王','小张','小黄',]),
'性别':pd.Series(['男','女','男','男','男','女','男','女'])
,'年龄':pd.Series(['12','12','14','15','18','18','17','19']),
'成绩':pd.Series([55,32,43,65,100,77,86,99])}
df = pd.DataFrame(d)
print('性别分组成功')
mysex = df.groupby('性别')
print(mysex['成绩'].agg([np.mean,np.max,np.min,np.sum]))
运行结果
性别分组成功
mean amax amin sum
性别
女 69.333333 99 32 208
男 69.800000 100 43 349