一. 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
df.head(8)
df.tail(8)
df.shape
df.dtypes
df.info()
df.drop(["序号1", "序号2"], axis=1)
df.columns
df.index
df.describe()
df.isnull()
df.dropna(how='all')
df.fillna('填充值')
df.fillna(method='pad')
df.fillna(value={'列首名': '替换值'})
df.fillna('填充值', limit=1)
df.fillna(axis=0)
df.drop_duplicates(subset=['序号1', '班级'], keep='last')
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]
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]
df.iloc[5:8, -1:0]
df.iloc[-1 : , 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")
df['序号2'].replace(11, 111111, inplace=True)
df.replace(np.NaN, '替换成这个值')
df.replace([14, 10, 9], 22222)
df.replace({14: 11111, np.NaN: 22222})
df.sort_values(by = ['序号1', '序号2'], ascending=[True, False])
df.sort_values(by = ['备注'], na_position='first')
df['序号1'].rank(method='average')
df['序号1'].rank(method='first')
df['序号1'].rank(method='min')
df['序号1'].rank(method='max')
df.drop(['序号1', '序号2'], axis=1)
df.drop(columns = ['序号1', '序号2'])
df.drop(df.columns[[1, 3]], axis=1)
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])
pd.qcut(df['序号1'], 2)
df.insert(1, '哈哈', [1, 2, 3, 4, 5, 6, 7])
df.T
df.stack()
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']
df['序号1'].count()
df.count()
df.count(axis=1)
df.sum()
df['序号1'].sum()
df.sum(axis=1)
df['序号1'].mean()
df.mean()
df.mean(axis=1)
df['序号1'].min()
df.min()
df.min(axis=1)
df['序号1'].max()
df.max()
df.max(axis=1)
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'})
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对象
待补充