Python 140个Pandas数据分析技巧
 **Pandas **常用于数据处理与分析,梳理了 140 个** Pandas **要点,帮助驾驭各类数据分析任务。 ## **Pandas基础操作** ### **1、创建DataFrame** ``` import pandas as pd data = {'姓名': ['张三', '李四', '王五'], '年龄': [25, 30, 35]} df = pd.DataFrame(data) print(df) ``` ### **2、从字典列表创建DataFrame** ``` data = [{'姓名': '张三', '年龄': 25}, {'姓名': '李四', '年龄': 30}] df = pd.DataFrame(data) print(df) ``` ### **3、读取CSV文件** ``` df = pd.read_csv('data.csv', encoding='utf-8') print(df.head()) ``` ### **4、读取Excel文件** ``` df = pd.read_excel('data.xlsx', sheet_name='Sheet1') print(df.head()) ``` ### **5、查看DataFrame基本信息** ``` print(df.info()) ``` ### **6、查看统计信息** ``` print(df.describe()) ``` ### **7、查看前N行数据** ``` print(df.head(3)) ``` ### **8、查看后N行数据** ``` print(df.tail(3)) ``` ### **9、查看列名** ``` print(df.columns) ``` ### **10、查看索引** ``` print(df.index) ``` ## **数据选择与过滤** ### **11、选择单列** ``` ages = df['年龄'] print(ages) ``` ### **12、选择多列** ``` subset = df[['姓名', '年龄']] print(subset) ``` ### **13、按行选择** ``` row = df.iloc[1] # 选择第二行 print(row) ``` ### **14、按条件过滤** ``` filtered = df[df['年龄'] > 30] print(filtered) ``` ### **15、多条件过滤** ``` filtered = df[(df['年龄'] > 25) & (df['姓名'] != '张三')] print(filtered) ``` ### **16、使用isin过滤** ``` filtered = df[df['姓名'].isin(['张三', '李四'])] print(filtered) ``` ### **17、使用query方法** ``` filtered = df.query('年龄 > 25 and 姓名 != "张三"') print(filtered) ``` ### **18、使用loc选择行和列** ``` subset = df.loc[0:1, ['姓名', '年龄']] print(subset) ``` ### **19、使用iloc选择行和列** ``` subset = df.iloc[0:2, 0:2] print(subset) ``` ### **20、随机抽样** ``` sample = df.sample(n=2) print(sample) ``` ## **数据清洗** ### **21、处理缺失值** ``` df.fillna(0, inplace=True) # 用0填充缺失值 ``` ### **22、删除缺失值** ``` df.dropna(inplace=True) ``` ### **23、删除重复行** ``` df.drop_duplicates(inplace=True) ``` ### **4、重命名列** ``` df.rename(columns={'姓名': 'name', '年龄': 'age'}, inplace=True) ``` ### **25、删除列** ``` df.drop(columns=['age'], inplace=True) ``` ### **26、转换数据类型** ``` df['age'] = df['age'].astype('float') ``` ### **27、字符串转小写** ``` df['name'] = df['name'].str.lower() ``` ### **28、字符串去空格** ``` df['name'] = df['name'].str.strip() ``` ### **29、替换值** ``` df['name'] = df['name'].replace('张三', '张小三') ``` ### **30、应用函数转换数据** ``` df['age'] = df['age'].apply(lambda x: x + 1) ``` ## **数据操作与转换** ### **31、添加新列** ``` df['年龄加1'] = df['年龄'] + 1 ``` ### **32、条件赋值** ``` df['年龄段'] = ['青年' if age 30') .groupby('gender') .agg({'income': 'mean'}) .sort_values('income', ascending=False)) ``` ### **98、内存使用分析** ``` print(df.memory_usage(deep=True)) ``` ### **99、数据类型优化** ``` df = df.convert_dtypes() ``` ### **100、性能分析** ``` %prun df.groupby('category').mean() ``` ## **数据处理** ### **101、字符串连接** ``` df['full_name'] = df['first_name'] + ' ' + df['last_name'] ``` ### **102、字符串分割** ``` df['name_parts'] = df['full_name'].str.split(' ') ``` ### **103、提取子串** ``` df['first_letter'] = df['name'].str[0] ``` ### **104、正则表达式提取** ``` df['area_code'] = df['phone'].str.extract(r'(\d{3})') ``` ### **105、正则表达式替换** ``` df['clean_phone'] = df['phone'].str.replace(r'\D', '') ``` ### **106、字符串包含检查** ``` df['has_com'] = df['email'].str.contains('.com') ``` ### **107、字符串长度** ``` df['name_length'] = df['name'].str.len() ``` ### **108、字符串填充** ``` df['id_padded'] = df['id'].str.pad(5, fillchar='0') ``` ### **109、字符串替换** ``` df['clean_text'] = df['text'].str.replace('[^\w\s]', '') ``` ### **110、词频统计** ``` from collections import Counter word_counts = Counter(' '.join(df['text']).split()) ``` ## **数据分析** ### **111、移动平均** ``` df['rolling_avg'] = df['value'].rolling(window=7).mean() ``` ### **112、指数平滑** ``` df['ewm'] = df['value'].ewm(span=7).mean() ``` ### **113、标准化数据** ``` df['normalized'] = (df['value'] - df['value'].mean()) / df['value'].std() ``` ### **114、分位数计算** ``` df['quantile'] = pd.qcut(df['value'], q=4, labels=False) ``` ### **115、相关性分析** ``` correlation = df.corr() ``` ### **116、协方差矩阵** ``` covariance = df.cov() ``` ### **117、主成分分析** ``` from sklearn.decomposition import PCA pca = PCA(n_components=2) df_pca = pca.fit_transform(df.select_dtypes(include='number')) ``` ### **118、聚类分析** ``` from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=3) df['cluster'] = kmeans.fit_predict(df.select_dtypes(include='number')) ``` ### **119、异常值检测** ``` df['is_outlier'] = (df['value'] - df['value'].mean()).abs() > 3 * df['value'].std() ``` ### **120、时间序列分解** ``` from statsmodels.tsa.seasonal import seasonal_decompose result = seasonal_decompose(df['value'], model='additive', period=12) result.plot() ``` ## **性能优化** **121、使用迭代器读取大文件** ``` chunks = pd.read_csv('大文件.csv', chunksize=10000) for chunk in chunks: process(chunk) ``` **122、分类数据优化** ``` df['类别列'] = df['类别列'].astype('category') ``` **123、使用eval表达式** ``` df.eval('新列 = 列1 + 列2', inplace=True) ``` **124、使用query提高性能** ``` df.query('年龄 > 30 & 性别 == "男"', inplace=True) ``` **125、使用at/iat快速访问** ``` df.at[0, '列名'] = 100 # 比loc更快 ``` **126、避免链式赋值** ``` # 不好 df['列'][df['条件']] = 值 # 好 df.loc[df['条件'], '列'] = 值 ``` **127、使用numpy操作** ``` import numpy as np df['新列'] = np.log(df['数值列']) ``` **128、避免循环** ``` # 不好 for i in range(len(df)): df.at[i, '新列'] = df.at[i, '列'] * 2 # 好 df['新列'] = df['列'] * 2 ``` **129、内存使用分析** ``` df.memory_usage(deep=True) ``` **130、释放内存** ``` import gc del df gc.collect() ``` ## **自定义函数与分组** **131、分组应用函数** ``` def custom_func(group): return group['数值列'].mean() / group['数值列'].std() df.groupby('分组列').apply(custom_func) ``` **132、映射函数** ``` df['等级'] = df['分数'].map(lambda x: 'A' if x > 90 else 'B' if x > 80 else 'C') ``` **133、按行应用函数** ``` df.apply(lambda row: row['列1'] + row['列2'], axis=1) ``` **134、分组聚合多个函数** ``` df.groupby('部门').agg({'销售额': ['sum', 'mean'], '利润': 'max'}) ``` **135、分组转换** ``` df['部门平均'] = df.groupby('部门')['销售额'].transform('mean') ``` **136、分组过滤** ``` df.groupby('部门').filter(lambda x: x['销售额'].mean() > 1000) ``` **137、滚动应用函数** ``` df['滚动平均'] = df['数值列'].rolling(5).apply(lambda x: x.mean()) ``` **138、扩展应用函数** ``` df['累计百分比'] = df['数值列'].expanding().apply(lambda x: x[-1]/x.sum()) ``` **139、分组时间重采样** ``` df.groupby('产品').resample('W')['销售额'].sum() ``` **140、自定义聚合器** ``` def top_n(df, n=3, column='销售额'): return df.sort_values(column, ascending=False).head(n) df.groupby('部门').apply(top_n) ``` 140个**Pandas**技巧能够高效处理各种数据分析任务。从基本的数据操作到处理时间序列、分类数据等的高级技术。在实际数据集上尝试这些技巧,有助于巩固对**Pandas**及其功能的理解,在实际项目中多加练习,将这些技巧融会贯通。 **“无他,惟手熟尔”!**有需要的用起来。 **如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐**❤!