工具:Anaconda3 + Python
Part01:读取文件
1️⃣ 导入Pandas库并设置别名
import pandas as pd
2️⃣ 数据加载到DataFrame变量
import pandas as pd
# test_1.csv
data1 = pd.read_csv('test_1.csv')
# test_2.xlsx
data2 = pd.read_excel('test_2.xlsx')
3️⃣ 读取数据的基本操作
import pandas as pd
data = pd.read_csv('test.csv')
# 读取文件前五行
print(data.head())
# 读取表结构的基本信息
print(data.info())
# 查看文件行数
print(data.shape[0])
Part02:数据清洗
1️⃣ 缺失值
# 检查缺失值
missing_sum = df.isnull().sum()
missing_percent = (df.isnull().sum() / len(df)) * 100
missing_info = pd.DataFrame({
'缺失数量': missing_sum,
'缺失比例%': missing_percent
})
print(missing_info[missing_info['缺失数量'] > 0])
# 可视化缺失值
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(10, 6))
sns.heatmap(df.isnull(), cbar=False, cmap='viridis')
plt.title('缺失值热图')
plt.show()
# 缺失值处理策略
def handle_missing_values(df):
"""
处理缺失值的多种策略
"""
df_clean = df.copy()
# 1. 删除缺失值过多的列
threshold = 0.7 # 缺失比例超过70%的列删除
cols_to_drop = missing_percent[missing_percent > threshold].index
df_clean.drop(columns=cols_to_drop, inplace=True)
# 2. 数值型列填充
numeric_cols = df_clean.select_dtypes(include=['number']).columns
for col in numeric_cols:
if df_clean[col].isnull().any():
# 根据数据分布选择填充方法
if df_clean[col].skew() > 1: # 偏态分布用中位数
df_clean[col].fillna(df_clean[col].median(), inplace=True)
else: # 对称分布用均值
df_clean[col].fillna(df_clean[col].mean(), inplace=True)
# 3. 分类列填充
categorical_cols = df_clean.select_dtypes(include=['object', 'category']).columns
for col in categorical_cols:
if df_clean[col].isnull().any():
df_clean[col].fillna(df_clean[col].mode()[0], inplace=True)
# 4. 时间序列填充
datetime_cols = df_clean.select_dtypes(include=['datetime']).columns
for col in datetime_cols:
if df_clean[col].isnull().any():
df_clean[col].fillna(method='ffill', inplace=True)
# 5. 删除剩余的行缺失
df_clean.dropna(inplace=True)
return df_clean
df_clean = handle_missing_values(df)
2️⃣ 重复值
# 检查重复值
duplicate_rows = df.duplicated().sum()
print(f"完全重复的行数: {duplicate_rows}")
# 基于关键列的重复检查
key_columns = ['user_id', 'timestamp']
duplicate_key = df.duplicated(subset=key_columns).sum()
print(f"基于关键列 {key_columns} 的重复: {duplicate_key}")
# 删除重复值
df_dedup = df.drop_duplicates(
subset=key_columns, # 基于哪些列检查重复
keep='first', # 保留第一个出现的数据
inplace=False
)
# 高级重复处理:考虑时间窗口
def remove_temporal_duplicates(df, id_col, time_col, window='1H'):
"""
在时间窗口内去除重复记录
"""
df = df.sort_values([id_col, time_col])
df['time_diff'] = df.groupby(id_col)[time_col].diff()
# 删除时间差小于窗口的重复记录
df = df[~(df['time_diff'] < pd.Timedelta(window))]
return df.drop(columns=['time_diff'])
3️⃣ 数据类型转换
# Age数据类型转换为int
data['Age'] = data['Age'].astype(int)
4️⃣ 列名修改
data = data.rename(columns:{'病人ID':'患者ID'},inplace=True)
未完待续...