Python数据处理:Pandas基础

Python数据处理:Pandas基础 Python数据处理Pandas基础一、Pandas简介Pandas是Python中最流行的数据分析库提供了高效的数据结构和数据分析工具。1.1 核心数据结构- Series一维标签数组- DataFrame二维标签数据结构1.2 安装Pandaspip install pandas二、Series基础2.1 创建Seriesimport pandas as pdimport numpy as np# 从列表创建s pd.Series([1, 2, 3, 4, 5])print(s)# 指定索引s pd.Series([1, 2, 3], index[a, b, c])# 从字典创建s pd.Series({a: 1, b: 2, c: 3})# 从标量创建s pd.Series(5, index[a, b, c])2.2 Series操作s pd.Series([1, 2, 3, 4, 5], index[a, b, c, d, e])# 访问元素print(s[a]) # 1print(s[0]) # 1print(s[[a, c]]) # 多个元素# 切片print(s[a:c]) # 包含结束索引print(s[0:3]) # 不包含结束索引# 布尔索引print(s[s 2])# 运算print(s 10)print(s * 2)print(s ** 2)三、DataFrame基础3.1 创建DataFrame# 从字典创建data {name: [Alice, Bob, Charlie],age: [25, 30, 35],city: [New York, Paris, London]}df pd.DataFrame(data)# 从列表的列表创建data [[Alice, 25, New York],[Bob, 30, Paris],[Charlie, 35, London]]df pd.DataFrame(data, columns[name, age, city])# 从NumPy数组创建data np.array([[1, 2, 3], [4, 5, 6]])df pd.DataFrame(data, columns[A, B, C])3.2 查看数据df pd.DataFrame({A: [1, 2, 3, 4, 5],B: [10, 20, 30, 40, 50],C: [a, b, c, d, e]})# 查看前几行print(df.head()) # 默认5行print(df.head(3)) # 前3行# 查看后几行print(df.tail())# 查看数据信息print(df.info())# 查看统计信息print(df.describe())# 查看形状print(df.shape) # (5, 3)# 查看列名print(df.columns)# 查看索引print(df.index)四、数据选择4.1 选择列df pd.DataFrame({name: [Alice, Bob, Charlie],age: [25, 30, 35],city: [New York, Paris, London]})# 选择单列返回Seriesprint(df[name])print(df.name) # 属性访问# 选择多列返回DataFrameprint(df[[name, age]])4.2 选择行# 使用loc基于标签print(df.loc[0]) # 第一行print(df.loc[0:2]) # 前三行包含结束print(df.loc[0, name]) # 特定位置# 使用iloc基于位置print(df.iloc[0]) # 第一行print(df.iloc[0:2]) # 前两行不包含结束print(df.iloc[0, 0]) # 特定位置# 布尔索引print(df[df[age] 25])print(df[(df[age] 25) (df[city] Paris)])4.3 条件选择# 单条件young df[df[age] 30]# 多条件result df[(df[age] 25) (df[city] Paris)]# isin方法cities df[df[city].isin([Paris, London])]# 字符串方法starts_with_a df[df[name].str.startswith(A)]五、数据修改5.1 添加列df[salary] [50000, 60000, 70000]df[bonus] df[salary] * 0.15.2 修改值# 修改单个值df.loc[0, age] 26# 修改整列df[age] df[age] 1# 条件修改df.loc[df[age] 30, status] Senior5.3 删除# 删除列df df.drop(bonus, axis1)df df.drop(columns[bonus])# 删除行df df.drop(0, axis0)df df.drop(index[0, 1])六、数据清洗6.1 处理缺失值df pd.DataFrame({A: [1, 2, np.nan, 4],B: [5, np.nan, np.nan, 8],C: [9, 10, 11, 12]})# 检查缺失值print(df.isnull())print(df.isnull().sum())# 删除缺失值df_dropped df.dropna() # 删除任何包含NaN的行df_dropped df.dropna(axis1) # 删除任何包含NaN的列df_dropped df.dropna(howall) # 删除全为NaN的行# 填充缺失值df_filled df.fillna(0) # 用0填充df_filled df.fillna(df.mean()) # 用均值填充df_filled df.fillna(methodffill) # 前向填充df_filled df.fillna(methodbfill) # 后向填充6.2 处理重复值# 检查重复print(df.duplicated())# 删除重复df_unique df.drop_duplicates()df_unique df.drop_duplicates(subset[name]) # 基于特定列6.3 数据类型转换# 查看数据类型print(df.dtypes)# 转换类型df[age] df[age].astype(int)df[date] pd.to_datetime(df[date])七、数据聚合7.1 基本统计df pd.DataFrame({A: [1, 2, 3, 4, 5],B: [10, 20, 30, 40, 50]})print(df.sum()) # 求和print(df.mean()) # 平均值print(df.median()) # 中位数print(df.std()) # 标准差print(df.min()) # 最小值print(df.max()) # 最大值print(df.count()) # 计数7.2 分组聚合df pd.DataFrame({category: [A, B, A, B, A],value: [10, 20, 30, 40, 50]})# 分组求和grouped df.groupby(category)[value].sum()# 多个聚合函数grouped df.groupby(category)[value].agg([sum, mean, count])# 多列分组df pd.DataFrame({category: [A, B, A, B],subcategory: [X, X, Y, Y],value: [10, 20, 30, 40]})grouped df.groupby([category, subcategory])[value].sum()八、数据合并8.1 concat连接df1 pd.DataFrame({A: [1, 2], B: [3, 4]})df2 pd.DataFrame({A: [5, 6], B: [7, 8]})# 垂直连接result pd.concat([df1, df2], axis0)# 水平连接result pd.concat([df1, df2], axis1)8.2 merge合并df1 pd.DataFrame({key: [A, B, C],value1: [1, 2, 3]})df2 pd.DataFrame({key: [A, B, D],value2: [4, 5, 6]})# 内连接result pd.merge(df1, df2, onkey, howinner)# 左连接result pd.merge(df1, df2, onkey, howleft)# 右连接result pd.merge(df1, df2, onkey, howright)# 外连接result pd.merge(df1, df2, onkey, howouter)8.3 join索引连接df1 pd.DataFrame({A: [1, 2]}, index[a, b])df2 pd.DataFrame({B: [3, 4]}, index[a, b])result df1.join(df2)九、数据透视9.1 pivot_tabledf pd.DataFrame({date: [2024-01, 2024-01, 2024-02, 2024-02],category: [A, B, A, B],value: [10, 20, 30, 40]})pivot df.pivot_table(valuesvalue,indexdate,columnscategory,aggfuncsum)9.2 crosstab交叉表df pd.DataFrame({gender: [M, F, M, F],age_group: [Young, Young, Old, Old],count: [10, 20, 30, 40]})crosstab pd.crosstab(df[gender],df[age_group],valuesdf[count],aggfuncsum)十、时间序列10.1 日期时间处理# 创建日期范围dates pd.date_range(2024-01-01, periods10, freqD)# 创建时间序列ts pd.Series(range(10), indexdates)# 日期解析df[date] pd.to_datetime(df[date])# 提取日期部分df[year] df[date].dt.yeardf[month] df[date].dt.monthdf[day] df[date].dt.daydf[weekday] df[date].dt.weekday# 时间偏移df[next_week] df[date] pd.Timedelta(days7)10.2 重采样# 创建时间序列dates pd.date_range(2024-01-01, periods100, freqD)ts pd.Series(range(100), indexdates)# 按月重采样monthly ts.resample(M).sum()# 按周重采样weekly ts.resample(W).mean()十一、文件读写11.1 CSV文件# 读取CSVdf pd.read_csv(data.csv)df pd.read_csv(data.csv, sep;, encodingutf-8)# 写入CSVdf.to_csv(output.csv, indexFalse)11.2 Excel文件# 读取Exceldf pd.read_excel(data.xlsx, sheet_nameSheet1)# 写入Exceldf.to_excel(output.xlsx, sheet_nameData, indexFalse)11.3 JSON文件# 读取JSONdf pd.read_json(data.json)# 写入JSONdf.to_json(output.json, orientrecords)十二、数据可视化12.1 基本绘图import matplotlib.pyplot as pltdf pd.DataFrame({A: [1, 2, 3, 4, 5],B: [10, 20, 15, 25, 30]})# 线图df.plot()plt.show()# 柱状图df.plot(kindbar)plt.show()# 散点图df.plot(kindscatter, xA, yB)plt.show()# 直方图df[A].plot(kindhist)plt.show()十三、性能优化13.1 使用向量化操作# 慢循环result []for value in df[A]:result.append(value * 2)# 快向量化result df[A] * 213.2 使用category类型# 对于重复值多的列df[category] df[category].astype(category)13.3 分块读取大文件# 分块读取chunks pd.read_csv(large_file.csv, chunksize10000)for chunk in chunks:process(chunk)十四、最佳实践1. 使用向量化操作而不是循环2. 合理使用索引提高查询速度3. 使用category类型节省内存4. 分块处理大文件5. 使用inplaceTrue减少内存复制6. 选择合适的数据类型7. 及时释放不需要的DataFrame十五、总结Pandas是Python数据分析的核心工具提供了强大的数据结构和丰富的数据操作方法。掌握Series和DataFrame的创建、选择、修改、聚合、合并等操作以及数据清洗、时间序列处理等技能可以高效地进行数据分析工作。