Python3-Pandas模块学习笔记3-DataFrame

DataFrame 数据帧

DataFrame是二维数据结构,即数据以行和列的表格方式排列。
DataFrame的功能特点:

  • 潜在的列是不同的类型
  • 大小可变
  • 标记轴(行和列)
  • 可以对行和列执行算数运算

学生数据

DataFrame 初始化

pandas.DataFrame(data,index,columns,dtypes,copy)

编号参数描述
1data数据采取各种形式,如ndarray,series,map,lists,dict,constant,另一个DataFrame
2index对于行标签,用于结果帧索引是可选缺省值np.arrange(n),如果没有传递索引值
3columns对于列标签,可选的默认语法是-np.arange(n)
4detype每列的数据类型。
5copy如果默认值为False,则此命令用于复制数据

创建DataFrame

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

import numpy as np
import pandas as pd

data = [1,2,3,4,5]
index=['a','b','c','d','e']
columns=['name']

#从列表创建DataFrame
df = pd.DataFrame(data=data,index=index,columns=columns)

data = [['Alex',10],['Gavin',12],['Bob',13]]
columns = ['name','age']
# 从列表创建DataFrame
df = pd.DataFrame(data=data,columns=columns)

# 从ndarrays/Lists的字典来创建DataFrame
# 所有ndarrays必须具有相同的长度。如果传递了索引(index),则索引的长度应等于数组的长度。如果没有传递索引,则默认情况下,索引将为range(n),其中n为数组长度
data = {'Name':['gavin','Alex','Bob'],'age':[10,12,13]}
index=['row1','row2','row3']
df = pd.DataFrame(data=data,index=index)

DataFrame 列操作

1.列选择

1
2
3
4
5
6
7
8
d = {
'one':pd.Series([1,2,3],index=['a','b','c']),
'two':pd.Series([1,2,3,4],index=['a','b','c','d'])
}

df = pd.DataFrame(d)

df['one']

2.列添加

1
2
3
df['three'] = pd.Series([10,20,30],index=['a','b','c'])
df['four'] = df['one']+ df['two']
df

3.列删除

1
del df['four']

DataFrame 行操作

1.行选择

1
2
3
4
5
6
7
8
9
10
d = {
'one':pd.Series([1,2,3],index=['a','b','c']),
'two':pd.Series([1,2,3,4],index=['a','b','c','d'])
}

df = pd.DataFrame(d)
#通过将行标签传递给loc()函数来选择行。
df.loc['b']
# 可以通过将整数位置传递给iloc[]函数来选择行。
print(df.iloc[1])

2.行切片

1
df[0:1]

3.附加行

1
2
3
4
5
6
7
df2 = pd.DataFrame(data=[{
'one':22,
'two':33
}],index=['e'])
print(df2)
df = df.append(df2)
df

4.删除行|列

1
2
3
4
5
df = df.drop(index=['a'])
df = df.drop(columns=['one'])

df = df.drop('a')
df

DataFrame基本功能

编号属性或方法描述
1T转置行和列
2axes返回一个列,行轴标签和列轴便签作为唯一的成员
3dtypes返回此对象中的数据类型
4empty如果NDFrame完全为空,则返回true
5ndim轴/数组维度大小
6shape返回DataFrame的维度的元素
7sizeNDFrame中的元素数
8valuesNDFrame的Numpy表示
9head()返回开头前n行
10tail()返回最后的n行

DataFrame 统计函数

编号函数描述
1count()非空观察数量
2sum()所有值之和
3mean()所有值的平均值
4median()所有值的中位数
5mode()值的模值
15var()方差
6std()值的标准偏差
7min()所有值中的最小值
8max()所有值中的最大值
9abs()绝对值
10prod()数组的元素的乘积
11cumsum()累积总和
12cumprod()累积乘积
13describe()汇总数据
14pivot_table()数据透视表:根据index统计values的关系

DataFrame数据预处理

编号函数描述
1sort_values()排序
2isnull()是否为空,缺失值
3dropna()去掉缺失值

DataFrame数据清洗

1
2
3
4
5
import pandas as pd
import numpy as ny
data = {'Chinese': [66, 95, 93, 90,80],'English': [65, 85, 92, 88, 90],'Math': [30, 98, 96, 77, 90]}
df1 = pd.DataFrame(data,columns=['Chinese','English','Math'],index=['zhangfei','guanyu','zhaoyun','huangzhong','dianwei'])
print(df1)
  1. 删除DataFrame中的不必要的行或者列
    使用DataFrame的drop方法
1
2
3
df1.drop(index=['zhangfei']) #列

df1.drop(columns=['zhangfei']) #行
  1. 重命名columns
1
df1.rename(columns={'English':'yingyu'})
  1. 去除重复的值
    使用 drop_duplicates() 自动去掉重复的行
1
df1.drop_duplicates()
  1. 更改数据格式
    数据格式不规范,使用astype函数来规范数据格式
1
2
df2 = df1['Chinese'].astype('float')
df2
  1. 数据间的字符处理
1
2
3
4
5
# 删除左右两边空格
df2['Chinese'].map(str.strip)

# 去除特殊符号
df['Chinese'] = df2['Chinese'].str.strip('$')
  1. 大小写转换
1
df1.columns = df1.columns.str.lower()
  1. 查找空值
    查找空值,返回dataFrame pandas.isnull()
    查找列空值,返回 pandas.isnull().any()
1
2
df1.isnull()
df1.isnull().any()
  1. 替换控制
    找到 NA/NaN 的值,并用指定的值去替换
    df1.fillna(replaceValue)
  1. 使用apply函数对数据进行清洗
    apply是Pandas中自由度非常高的函数,使用频率也非常高,可以自定义更复杂的函数
1
df['name'] = df['name'].apply(str.upper)

数据表合并

基础数据

1
2
3
4
5
6
7
8
9
import pandas as pd
import numpy as np

df1 = pd.DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
df2 = pd.DataFrame({'name':['ZhangFei', 'GuanYu', 'A', 'B', 'C'], 'data2':range(5)})

print(df1)
print('----'*5)
print(df2)

  1. 基于指定列进行连接

merage 合并后,取两者都群在的,生成新的DataFrame

1
2
df3 = pd.merge(df1,df2,on=['name'])
df3
  1. inner 内连接
    inner内连接就是merage合并的默认情况

  2. left 左连接
    以第一个DF为主进行连接,第二个DataFrame作为补充,没有对应值,设置为NaN

1
2
df3 = pd.merge(df1,df2,how='left')
df3
  1. right 右连接
    以第二个DataFrame为主进行连接,第1个DataFrame作为补充,没有对应值,设置为NaN

    1
    2
    df4 = pd.merge(df1,df2,how='right')
    df4
  2. outlet 内连接
    外链接相当于求两个DataFrame的并集

1
2
df5 = pd.merge(df1,df2,how='outlet')
df5