python的pandas库的DataFrame和Series对象操作

一. Dataframe对象

1.1 创建Dataframe

方式解释
单列表,元组通过单个列表或元组创建dataframe, pd会自动为这列数据添加行索引和列索引, 默认从0开始
嵌套列表,元组通过嵌套的列表或者元组创建dataframe, pd会生成多行数据,并自动添加行索引和列索引, 默认从0开始
指定列索引columns参数,接受一个列表参数, 指定列的索引名, 注意列表内的元素个数必须和dataframe的列数一样多
指定行索引index参数, 接受一个列表参数, 指定行索引名, 注意列表内的元素个数必须和dataframe的行数一样多
字典通过字典创建dataframe, pd会自动将key作为列的索引, 一个字典为一列数据
import pandas as pd

# 单个列表
df1 = pd.DataFrame(["a", "b", "c"])
df1 = pd.DataFrame(("a", "c", "d"))

# 嵌套列表
df1 = pd.DataFrame([[1, 2, 3], [1, 2, 3], [1, 2, 3]])
df1 = pd.DataFrame([(1, 2, 3), (1, 2, 3), (1, 2, 3)])

# 指定列索引
df1 = pd.DataFrame([["a", "b", "c"], ["a", "b", "c"]], columns=["第一列", "第二列", "第三列"])
# 指定行索引
df1 = pd.DataFrame([["a", "b", "c"], ["a", "b", "c"]], index=["第一行", "第二行"])

# 字典
df1 = pd.DataFrame({"一列": ["a", "b"], "二列": ["c", "d"], "三列": ["e", "f"]})

1.2 数据预处理

方法解释
head()读取指定数量的数据, 接受一个整型参数, 默认为5行
tail()渎职指定数量的末尾数据
info()查看每列有多少个不为空的数据单元格, 并返回该列的数据类型
columns查看列首名称, 也可以重新设置列首
index查看行首名称, 也可以重新设置行首
set_index()重新设置行首, 参数为列首的名称, 也可以接受列表参数, 设置多行行首索引
reset_index()将原层次化的索引,重置为columns索引, level为重置第几个, 0是第一个, drop为True时删除源层次化索引,默认为False,inplace用来指定是否修改原表数据
rename()可以对部分或者全部列索引或者行索引进行重命名, columns, index接受一个字典参数
shape查看datafrme的概况, 返回一个元组(12, 6), 表示共有12行, 多少6列
dtypes查看各列数据类型
drop()删除指定列, data.drop([“姓名”], axis=1) , 列表内为待删除的列首名, axis为指定删除多少列,该参数必传
drop_duplicates删除相同行数据, 只保留第一行,默认为删除两行数据全部相同的数据, subset可以指定删除某列相同的一行数据, 如果参数为列表,则删除这两列都是相同的一行数据,keep参数可以设置保留哪行数据, False全部删除, first保留第一行, last保留最后一行
describe()返回dataframe中所有数值类型的列的 count该列共有多少行,mean平均值,min最小值,max最大值等等
isnull()查看是否缺失值, 缺失返回True, 不缺失返回False
dropna()删除含有缺失值的行数据, 接受how='all’参数,
fillna()对NaN的单元格进行填充, value接受一个字典参数{列首名称: 替换值}, method接受’backfill’, ‘bfill’, ‘pad’, ‘ffill’ , axis接受0或者1,列或者行填充, inplace接受布尔值,表示是都在原表基础上修改, limit接受整型参数,表示替换多少个
astype对某列数据类型进行转换

file = r'{}\Desktop\test_file.xlsx'.format(path)

df = pd.read_excel(file, sheet_name="class")

# 查看全部数据
df

# 查看指定行数的数据, 默认为5行
df.head(8) # 前8行
df.tail(8) # 后8行

# 查看dataframe的数据概况, 返回元组 (12, 6) 表示12为行数, 6为列数
df.shape

# 查看每列的列首和该列的数据类型
df.dtypes

# 查看每列 的有多少个不为空数据单元格, 并返回该列的数据类型
df.info()

# 删除指定列, 列表内为列首名, axis为删除多少列 该参数必传
df.drop(["序号1", "序号2"], axis=1)

# 查看列首名称
df.columns

# 查看行首名称
df.index

# 查看以数值列的各项结果 max, min, count, mean等等
df.describe()

# 查看缺失,如果缺失返回True, 不确实返回False
df.isnull()

# 删除含有缺失值的行, 默认删除带有NaN的行数据, 如果换入how='all', 则只删除全部为NaN的行数据
df.dropna(how='all')

# 对NaN值进行填充
df.fillna('填充值')
df.fillna(method='pad')
df.fillna(value={'列首名': '替换值'})
df.fillna('填充值', limit=1)
df.fillna(axis=0) # 0 表示按照列填充, 1表示按照行填充

# 删除相同行数据, 只保留第一行,默认为删除两行数据全部相同的数据, subset可以指定删除某列相同的一行数据, 如果参数为列表,则删除这两列都是相同的一行数据,keep参数可以设置保留哪行数据, False全部删除, first保留第一行, last保留最后一行
df.drop_duplicates(subset=['序号1', '班级'], keep='last')

# 对序号1列的数据类型进行转换
df['序号1'].dtypes
df['序号1'] = df['序号1'].astype('float')
df[['序号1', '序号2']] = df[['序号1', '序号2']].astype(int)

# 重新设置列首和行首
df.columns = [1, 2, 3, 4, 5, 6]
df.index = [11, 22, 33, 44, 55, 66, 77, 88, 99, 1010, 1111, 1212, 1313]
df

# 冲设置行首, 参数为某列名称
df.set_index(['序号1', '序号2'])

# 可以对部分或者全部列索引进行重命名
df.rename(columns={"序号1": 1, "序号2": 2, "班级": 3, "学科": 4, "位置": 5})

1.3 数据选择

file = r'{}\Desktop\test_file.xlsx'.format(path)

df = pd.read_excel(file, sheet_name="class")

# 通过列首名称选择数据列
df[['序号1', '序号2']]

# 通过列索引选择(指定选择的列索引)
df.iloc[:, [0, 2]]
df.iloc[: 2]

# 通过列索引, 连续选择(列索引以0开头, 不包括尾列)
df.iloc[:, 0:7]

# 获取所有列
df.iloc[:]

# 通过行首名称选择
df.loc[["第三行首名", "第五行首名", "第八行首名"]]
df.loc["第一行首名"]

# 通过行索引选择
df.loc[[1, 3]]
df.loc[1]

# 通过行索引连续选择
df.loc[2:8]


# 通过行和列同时进行选择
# 通过索引
df.iloc[5:8, 2:4] # 表示 5-8 行的 2-4 列数据
df.iloc[5:8, -1:0] # 5-8 行的 最后一列
df.iloc[-1 : , 2:4] # 最后一行的 2-4 列
# 通过行首和列首名称
df.iloc[[1, 5], [2, 4, 0]]

# 通过条件
df[(df['序号1'] >= 5) & (df['序号2'] > 10)] 
df.loc[df['序号1'] >= 5, ['班级', "序号2"]] # 先根据条件筛选, 再根据列首名称筛选
df.loc[5, '班级']

# 字符串查询
df[df['班级'].str.contains('df字符串中包含这个字符串的行, 将被筛选出来')]
df[df['班级'].str.startswith('df字符串中包含这个字符串的行, 将被筛选出来')]
df[df['班级'].str.endswith('df字符串中包含这个字符串的行, 将被筛选出来')]

1.4 数据操作

方法解释
replace()替换:支持对符合条件的某列替换或全表替换
sort_values()排序:支持对某一列或多列数据进行排序
rank()数值排名: average, first, min, max
drop()删除: 删除指定行,列数据, axis=1表示删除列, axis=0表示删除行
value_counts()统计元素, normalize参数表示占比, sort表示占比顺序
unique()获取唯一值, 对某列元素去重,获取唯一值
isin()数值查找:支持对某列或者全表进行查找, 接受一个列表参数
cut()pandas顶级方法, bins参数接受一个列表, 将某列按照列表内的区间进行切分
qcut()pandas顶级方法, 接受一个表示区间数量的参数, 并对某列数据按照该区间数量进行切分
insert()插入列数据, 接受三个参数, 插入列索引, 插入列首名称, 待插入数据
.T行列互换
apply()对dataframe表中的某列或者某行进行函数操作
applymap()对全表的数据进行函数操作
file = r'{}\Desktop\test_file.xlsx'.format(path)

df = pd.read_excel(file, sheet_name="class")

# 替换某列中的 符合条件的值, 11为条件, 111111为替换值
df['序号2'].replace(11, 111111, inplace=True)

# 替换全表符合条件的值 n'p
df.replace(np.NaN, '替换成这个值') # NaN值替换
# df.replace(14, 111) 一对一 替换
df.replace([14, 10, 9], 22222) # 多对一 替换
df.replace({14: 11111, np.NaN: 22222}) # 多对多 替换

# 按照选择的列进行排序, ascending True为正序, False为倒序, 默认为True, 当接受多个排序参数时, 都以第一个参数排序的结果为基础进行再排序
df.sort_values(by = ['序号1', '序号2'], ascending=[True, False])
df.sort_values(by = ['备注'], na_position='first') # 将该列排序后的值为NaN的行数据, 进行重排. 接受first, last

# 对选择的列进行 数值排名
df['序号1'].rank(method='average') # 取平均值, 假如有两个 1时, 第一个排名1, 第二个排名2, 两个排名相加 然后取平均值 即为1.5
df['序号1'].rank(method='first') # 取相同数值里,最先出现的值的排名
df['序号1'].rank(method='min') # 取相同数值里, 排名最差的
df['序号1'].rank(method='max') # 取相同数值里, 排名最优的

# 对符合条件的数据进行删除
# 删除列 axis=1 表示删除列
df.drop(['序号1', '序号2'], axis=1) # 通过列首名称进行删除
df.drop(columns = ['序号1', '序号2']) # 通过列首名称进行删除, 不需要传递axis参数
df.drop(df.columns[[1, 3]], axis=1) # 通过列首索引删除
# 删除行 axis=0 表示删除行
df.drop([0, 1, 5], axis=0) # 通过行首名称进行删除
df.drop(df.index[[0, 1, 5]], axis=0) # 通过行首索引进行删除

# 对数值进行计数
df['序号1'].value_counts() # 统计元素出现次数
df['序号1'].value_counts(normalize=True) # 统计元素占比, 默认按照占比的降序进行排列
df['序号1'].value_counts(normalize=True, sort=False) # 统计元素占比, 按照升序进行排列

# 获取唯一值
df['序号1'].unique()

# 数值查找
df['序号1'].isin([1, 5, 8]) # 对某列进行查找
df.isin([1, 5, 8]) # 对全表进行查找

# 区间切分
pd.cut(df['序号1'], bins=[0, 6, 100]) # pandas的顶级方法, 将序号1列 按照0-6, 6-1000 切分成两组
pd.qcut(df['序号1'], 2) # pandas顶级方法, 将序号1列 切分成2个区间

# 插入数据
# pandas中没有插入新的一行数据的方法, 可以考虑采取将待插入的行数据左行一个dataframe,然后将两个表合并
# 插入新的一列数据
df.insert(1, '哈哈', [1, 2, 3, 4, 5, 6, 7]) # 新插入的数据, 必须与原列数据有相同条目数

# 行列数据互换
df.T

# 索引重塑
df.stack() # 将列索引 按照原有的行索引分组后 变更成行索引, 新的dataframe为一个树状图
df.unstack() # 将树状图转换为 表格

# 函数操作
df['序号1'].apply(lambda x:x + 100) # 对某列或者某行进行函数操作
df.applymap(lambda x: str(x)) # 对全表进行函数操作

1.5 数据运算

方法解释
算术运算加减乘除
比较运算大于,小于,等于,不等于
count()求表中元素不为空的数量
sum()求合
mean()求平均值
max()求最大值
min()求最小值
median()求中位数
mode()求众数
var()求平方差
std()求标准差
quantile()求分位数
corr()相关性运算: 求两组数据的相关性, 或者整表
file = r'{}\Desktop\test_file.xlsx'.format(path)

df = pd.read_excel(file, sheet_name="class")

# 算数运算: 加减乘除
df['序号1'] + df['序号2']
df['序号1'] - df['序号2']
df['序号1'] * df['序号2']
df['序号1'] / df['序号2']

# 比较运算: 大于小于等于
df['序号1'] > df['序号2']
df['序号1'] < df['序号2']
df['序号1'] == df['序号2']
df['序号1'] != df['序号2']

# 汇总运算
# 查看元素非空数量 count
df['序号1'].count() # 查看该列非空元素的个数
df.count() # 查看整表中非空元素 每列的个数
df.count(axis=1) # 查看整表中每行非空的个数

# 求合 sum
df.sum() # 对整张表中 列为int型数据 进行求合
df['序号1'].sum() # 对指定列求合
df.sum(axis=1) # 对每一行求合

# 求平均值 mean
df['序号1'].mean() # 对该列求平均值
df.mean() # 对全表的每列求平均值
df.mean(axis=1) # 对全表的每行求平均值

# 求最小值 min
df['序号1'].min()
df.min()
df.min(axis=1)

# 求最大值 max
df['序号1'].max()
df.max()
df.max(axis=1)

# 中位数 median
df['序号1'].median()
df.median()
df.max(axis=1)

# 求众数: 一组数据中某个数值出现最多的数值, 支持对字符串的操作
df['班级'].mode()
df.mode()
df.mode(axis=1)

# 求平方差 
df['序号1'].var()
df.var()
df.var(axis=1)

# 求标准差
df['序号1'].std()
df.std()
df.std(axis=1)

# 求分位数
df['序号1'].quantile(0.5)
df.quantile(0.5)
df.quantile(0.25, axis=1)

# 相关性运算
df['序号1'].corr(df['序号2'])
df.corr()

1.6 数据分组/透视表

file = r'{}\Desktop\test_file.xlsx'.format(path)

df = pd.read_excel(file, sheet_name="class")

# 按照一列进行分组, 支持函数操作
df.groupby('分组').count()
df.groupby('分组').sum()
df.groupby('分组').min()

# 按照多列进行分组, 先满足第一列分组, 再进行第二列分组
df.groupby(['分组', '备注']).count()
df.groupby(['分组', '备注']).sum()
df.groupby(['分组', '备注']).max()

# 分组后去除数据
df.groupby('分组')['序号1'].max()

# 使用多种运算
df.groupby('分组').aggregate(['count', 'sum'])

# 对不同的分组做不同的运算
df.groupby('分组').aggregate({'序号1': 'count', '序号2': 'sum'})

# 将分组后的结果 转化为标准的dataframe
df.groupby('分组').sum().reset_index()

# 获取分组后得结果
df.groupby('第一列名')

1.7 拼接Dataframe对象

https://blog.csdn.net/guofei_fly/article/details/85455813

方法解释
concat()pandas顶级方法, 提供行间或列间进行内连接或外连接
append()行方向拼接
join()列方向拼接
merge()pandas顶级方法, 提供了类似sql语句的连接功能, 支持左连接, 右连接, 内连接, 外连接

1.7.1 concat

当两个dataframe有相同列索或者相同行索引引时, 挪到同一列或者同一行显示

参数解释
axis拼接方向, 默认为0, 沿着行拼接, 若为1, 则为沿列拼接
join拼接区域, 默认为outer, 拼接两个datafrme所有区域, 缺失补全NaN, 若为inner, 则拼接公共区域
keys建立多重索引, 接受一个列表参数, 根据拼接方向, 建立额外行或者列的索引
levels未知
names未知
verify_integrity未知
copy未知

代码演示:

file = os.getcwd() + '\\Desktop\\test_file.xlsx'

dataframes = pd.read_excel(file, sheet_name=["class", "student"])
d1 = dataframes.get("class")
d2 = dataframes.get("student")

dataframe_all = pd.concat([d1, d2], axis=0)
dataframe_all = pd.concat([d1, d2], axis=1, join='inner')

dataframe_all = pd.concat([d1, d2], axis=0, keys=["第一组", "第二组"])

1.7.2 append

参数解释
ignore_index如果为True时, 则对index进行重排
verify_intergrity对index的唯一性进行验证, 若有重复, 报错. 若已经设置了ignore_index, 则该参数无效
file = os.getcwd() + '\\Desktop\\test_file.xlsx'

dataframes = pd.read_excel(file, sheet_name=["class", "student"])
d1 = dataframes.get("class")
d2 = dataframes.get("student")

d1.append(d2)

1.7.3 join

参数解释
how按照哪个dataframe进行拼接, 其它dataframe进行补全, 接受left, right, inner, outer, 默认为全连接
lsuffix如果出现相同的列名, 则进行修改左边列表
rsuffix如果出现相同的列名, 则进行修改右边的列表
sort未知
on未知
file = os.getcwd() + '\\Desktop\\test_file.xlsx'

dataframes = pd.read_excel(file, sheet_name=["class", "student"])
d1 = dataframes.get("class")
d2 = dataframes.get("student")

d1.join(d2, how='inner')
d1.join(d2, lsuffix="增加后缀")

1.8 合并Dataframe对象

参数解释
on指定merge时以哪列为合并条件, 接受一个列首字符串或者列表内 多个列首字符串
how指定两张表的补全 举例: 接受left时, 以左边表数据为基础, 右表自动对齐补全. 可以接受left, right和outer(两张表的全量数据,互相补全)
suffixes当两个dataframe存在同名时, 指定字符串的尾缀, 用以区分
left_on, right_on当要合并的两个dataframe的列首不同名时,需要分别进行指定, 可以接受字符串或者列表参数
left_index, right_index未知
file = os.getcwd() + '\\Desktop\\test_file.xlsx'

dataframes = pd.read_excel(file, sheet_name=["class", "student"])
d1 = dataframes.get("class")
d2 = dataframes.get("student")

dataframe_all = pd.merge(d1, d2, on="序号1", suffixes=("左边", "右边"))
dataframe_all = pd.merge(d1, d2, how="inner", left_on=["序号1", "序号2"], right_on=["序号11", "序号22"])
dataframe_all = pd.merge(d1, d2, left_index=True, right_index=True, how="outer")
dataframe_all

二. Series对象

待补充

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值