能搜到这篇博文的,说明对Dataframe还是有一定了解的,这里就不过多文字介绍,直接上干货!!!
目录
导包
# 没安装的先安装pandas包
# pip install pandas
import pandas as pd
一、文件读取为Dataframe
1. 读取CSV文件
# 情况一 表格有表头
df = pd.read_csv('./path/to/CSV.csv')
# 情况二 表格没表头
df = pd.read_csv('./path/to/CSV.csv', header=None)
2. 读取Excel文件
# 情况一 单个sheet
df = pd.read_excel('./path/to/Excel.xlsx', header=None)
# 情况二 多个sheet,先读取整个文件
xls = pd.ExcelFile('./path/to/Excel.xlsx')
# 查看所有sheet的名称
xls.sheet_names
# 读取sheet
sheet = xls.prase('sheet_name')
二、创建Dataframe
1. 创建空的Dataframe带列名
# 列名
cols = ['A', 'B', 'C']
df = pd.DataFrame(columns=cols)
2. 创建有数据的Dataframe
# 情况一 二维列表型
cols = ['姓名', '学号', '性别']
data = [
['张三', '李四', '王五'], # 【姓名】列
[ 0, 2, 3], # 【学号】列
[ '男', '女', '未知'] # 【性别】列
]
# 需要将二维列表转置
transposed = [list(row) for row in zip(*data)]
# 转置结果
[
['张三', 0, '男'],
['李四', 2, '女'],
['王五', 3, '未知']
]
df = pd.DataFrame(transposed, columns=cols)
# 情况二 字典型
data = {
'姓名': ['张三', '李四', '王五'],
'学号': [ 0, 2, 3],
'性别': [ '男', '女', '未知']
}
df = pd.Dataframe(data)
# 情况三 字典的键值key-value转为两列数据
dict = {'A': 1, 'B': 2, 'C': 3}
df = pd.DataFrame(list(dict.items()), columns=['Key', 'Value'])
- 查询Dataframe的所有列名df.columns
三、关于NaN(空缺值)的处理
1. 使用固定值填充
可以使用一个固定的值,如0或者平均值来填充缺失值。可以使用fillna()
方法来实现,为保证同一列的数据类型一致性,根据所在列的数据类型进行对应类型的空值进行填充,例如:
# 【A】列为数值型
df['A'].fillna(0, inplace=True)
# 【B】列为字符型
df['B'].fillna('', inplace=True)
# 多列缺失值填充
df.fillna({'A': 0, 'B': ''}, inplace=True)
2. 使用前一个或后一个有效值填充
可以使用前一个或后一个有效值来填充缺失值,这在时间序列数据中较为常见。可以使用fillna()
方法的method
参数来指定填充方式,例如:df.fillna(method='ffill')
使用前一个有效值填充,df.fillna(method='bfill')
使用后一个有效值填充。
3. 使用插值方法填充
可以使用插值方法根据已有的数据进行估计并填充缺失值。可以使用interpolate()
方法来实现,例如:df.interpolate()
。
4. 使用平均值或中位数填充
可以使用特定列的平均值或中位数来填充该列的缺失值。可以使用mean()
或median()
方法来计算平均值或中位数,并使用fillna()
方法进行填充,例如:df['column'].fillna(df['column'].mean())
。
四、删除重复行drop_duplicates
注意:在删除重复行时,最好保证数据没有缺失值
1. 删除完全重复行
# 方法一 原表重新赋值
df = df.drop_duplicates()
# 方法二 原表修改
df.drop_duplicates(inplace=True)
2. 根据特定多列值重复,删除重复行
df = pd.DataFrame({
'A': [1, 2, 2, 2, 4],
'B': ['a', 'b', 'b', 'c', 'a'],
'C': [10, 23, 12, 13, 12]
})
# 如果【A】与【B】两列都重复则删除重复行,只保留一行数据(默认保留第一个出现的重复行)
df.drop_duplicates(subset=['A', 'B'], inplace=True)
五、删除行/列
1. 删除行
# 方法一 利用索引 drop默认axis=0,对行进行操作
df_new = df.drop(0)
# 方法二 利用切片
df_new = df[1:]
2. 删除列
# 方法一 使用drop函数
df.drop('B', axis=1, inplace=True)
# 方法二 使用del
del df['B']
- 关于axis:
axis
参数用于指定操作沿着行轴(axis=0,默认值
)还是列轴(axis=1
)进行。
六、表连接
1. 左/右连接
# 左连接
df_left = pd.merge(df1, df2, on='key', how='left')
# 右连接
df_right = pd.merge(df1, df2, on='key', how='right')
2. 内/外连接
# 内连接
df_inner = pd.merge(df1, df2, on='key', how='inner')
# 外连接
df_outer = pd.merge(df1, df2, on='key', how='outer')
3. 自连接
# 自连接
df_self_join = df.merge(df, left_on='ManagerID', right_on='EmployeeID', suffixes=('_Employee', '_Manager'))
4. 交叉连接(笛卡尔积)
# 交叉连接
df_cross = df1.merge(df2, how='cross')
七、表拼接
# df1与df2列数必须相同
pd.concat([df1, df2])
八、新增列
1. 新增列tqdm+progress_apply实现遍历行数据新增列,并展现数据处理进度。
tqdm.pandas()
df['new_column'] = df.progress_apply(lambda r: func(r),axis=1).fillna('-')
九、groupby使用
1. 按列计数并排序
count_df = df.groupby('column').size().reset_index(name='count').sort_values('count')
2. 按列分组并将value列合并,# 将Value列的值进行分组拼接
concat_df = df.groupby('index_column')['value_column'].apply(
lambda x: ';'.join(map(str, x))).reset_index(name='value')
番外1:关于参数inplace
inplace
是一个可选参数,用于指定是否在原始对象上进行修改。1)当
inplace=True
时,会直接在原始对象上进行修改,而不返回一个新的对象。# 在df原表上删除【A】列数据 df.drop('A', axis=1, inplace=True)
2)当
inplace=False
时,默认情况下会返回一个新的修改后的对象,需要一个新的变量接收。# 删除df表的【A】列数据并赋值给df1表,df表依旧保留了【A】列 df1 = df.drop('A', axis=1)
使用
inplace=True
可以节省内存空间,因为不需要创建一个新的对象来保存修改后的结果。这对于大型数据集或内存受限的环境中特别有用。
番外2:DataFrame的深复制与浅复制
1)浅复制(Shallow Copy): 浅复制是创建原始DataFrame的一个引用副本,而不是创建一个新的DataFrame对象。这意味着原始DataFrame和复制后的DataFrame共享相同的数据和索引。当对复制后的DataFrame进行修改时,原始DataFrame也会受到影响,反之亦然。
df_copy = df
2)深复制(Deep Copy): 深复制是创建一个完全独立的新DataFrame对象,包括数据、索引和列名。复制后的DataFrame与原始DataFrame没有任何关联,对复制后的DataFrame进行的修改不会影响原始DataFrame。
# 方法一 使用copy函数
df_copy = df.copy(deep=True)
# 方法二 利用切片
df_copy = df[:]