ManySpeech —— 使用 C# 开发人工智能语音应用
2025/12/17 22:46:32
Series:一维带标签数组,类似于 Excel 中的单列数据
importpandasaspdimportnumpyasnp# 创建 Series 的几种方式s1=pd.Series([10,20,30,40])# 默认整数索引s2=pd.Series([100,200,300],index=['a','b','c'])# 自定义标签索引s3=pd.Series({'北京':2154,'上海':2428,'广州':1867})# 从字典创建DataFrame:二维表格型数据结构,是数据分析的主要载体
# 创建 DataFramedf=pd.DataFrame({'姓名':['张三','李四','王五','赵六'],'年龄':[25,30,35,28],'城市':['北京','上海','广州','深圳'],'工资':[8000,12000,15000,10000]})# 从文件读取数据(最常用)df_csv=pd.read_csv('data.csv')# 读取 CSV 文件df_excel=pd.read_excel('data.xlsx')# 读取 Excel 文件df_json=pd.read_json('data.json')# 读取 JSON 文件Pandas 提供了多种快速查看数据的方法。
# 查看数据前几行和后几行df.head(3)# 查看前3行,默认5行df.tail(2)# 查看后2行,默认5行df.sample(3)# 随机查看3行,了解数据分布# 获取数据基本信息print(f"数据形状:{df.shape}")# 输出 (行数, 列数)print(f"数据维度:{df.ndim}")# 维度数(DataFrame为2)# 查看数据类型和内存信息df.info()# 显示各列数据类型、非空值数量和内存使用df.dtypes# 只查看各列数据类型df.memory_usage()# 查看各列内存使用情况# 数值型数据的统计摘要df.describe()# 显示计数、均值、标准差、最小值、四分位数、最大值df.describe(include='all')# 包含所有类型列的统计选择列数据:
# 选择单列 - 返回 Series年龄列=df['年龄']# 选择多列 - 返回 DataFrame姓名年龄=df[['姓名','年龄']]# 使用点表示法(列名需符合变量命名规则)df.年龄# 等价于 df['年龄']选择行数据:
# 按标签选择(loc) - 使用索引标签df.loc[0]# 选择索引为0的行df.loc[0:2]# 选择索引0到2的行(包含2)df.loc[[0,2,3]]# 选择索引为0,2,3的行# 按位置选择(iloc) - 使用整数位置df.iloc[0]# 选择第0行(从0开始计数)df.iloc[0:3]# 选择第0到2行(不包含3)df.iloc[[0,2]]# 选择第0和第2行# 布尔索引(条件筛选)df[df['年龄']>30]# 年龄大于30的行df[(df['年龄']>25)&(df['工资']<12000)]# 多条件筛选df[df['城市'].isin(['北京','上海'])]# 城市在北京或上海df[~df['城市'].isin(['广州'])]# 城市不是广州(~表示取反)数据清洗用来在数据分析中确保数据质量。
处理缺失值:
# 检测缺失值df.isnull()# 返回布尔DataFrame,显示每个单元格是否为空df.isnull().sum()# 统计每列缺失值数量df.isnull().any()# 检查每列是否有缺失值# 处理缺失值df.dropna()# 删除包含任何缺失值的行df.dropna(axis=1)# 删除包含任何缺失值的列df.dropna(subset=['年龄','工资'])# 只删除指定列有缺失值的行df.fillna(0)# 用0填充所有缺失值df.fillna({'年龄':df['年龄'].mean()})# 年龄列用平均值填充df.fillna(method='ffill')# 用前一个有效值填充(前向填充)df.fillna(method='bfill')# 用后一个有效值填充(后向填充)# 插值填充df.interpolate()# 线性插值填充处理重复数据:
# 检测重复行df.duplicated()# 标记重复行(除第一次出现外)df.duplicated().sum()# 统计重复行数量# 删除重复行df.drop_duplicates()# 删除完全重复的行df.drop_duplicates(subset=['姓名'])# 基于姓名列删除重复df.drop_duplicates(subset=['姓名'],keep='last')# 保留最后一次出现数据类型转换:
# 转换数据类型df['年龄']=df['年龄'].astype('int32')# 转换为32位整数df['工资']=df['工资'].astype('float64')# 转换为双精度浮点数df['入职日期']=pd.to_datetime(df['入职日期'])# 转换为日期时间# 重命名列df.rename(columns={'旧列名':'新列名'},inplace=True)# 重命名单个列df.rename(columns={'姓名':'员工姓名','年龄':'员工年龄'},inplace=True)# 重命名多个列df.columns=['列1','列2','列3']# 重命名所有列排序和索引操作用来对数据进行组织和整理。
# 按值排序df.sort_values('年龄')# 按年龄升序排序df.sort_values('年龄',ascending=False)# 按年龄降序排序df.sort_values(['城市','年龄'])# 先按城市排序,再按年龄排序df.sort_values(['城市','年龄'],ascending=[True,False])# 城市升序,年龄降序# 按索引排序df.sort_index()# 按索引升序排序df.sort_index(ascending=False)# 按索引降序排序# 重置索引df.reset_index()# 将索引转换为列,新建默认整数索引df.reset_index(drop=True)# 直接重置为整数索引,不保留原索引df.reset_index(drop=True,inplace=True)# 原地修改,不创建新对象分组聚合是数据分析的核心,用于计算分组统计量。
# 基本分组操作按城市分组=df.groupby('城市')# 按城市分组按城市分组.groups# 查看分组结果按城市分组.size()# 查看每组大小# 单列聚合df.groupby('城市')['工资'].mean()# 按城市计算平均工资df.groupby('城市')['工资'].sum()# 按城市计算工资总和df.groupby('城市')['年龄'].max()# 按城市计算最大年龄df.groupby('城市')['年龄'].min()# 按城市计算最小年龄df.groupby('城市')['姓名'].count()# 按城市统计人数# 多列聚合df.groupby('城市').agg({'年龄':['mean','min','max'],'工资':['sum','mean','std']})# 命名聚合结果df.groupby('城市').agg(平均年龄=('年龄','mean'),最高工资=('工资','max'),人数=('姓名','count'))# 多级分组df.groupby(['城市','年龄']).mean()# 按城市和年龄两级分组在实际项目中,数据往往来自多个源,需要合并处理。
纵向合并(添加行):
# 简单合并(要求列相同)df_all=pd.concat([df1,df2,df3])# 默认纵向合并df_all=pd.concat([df1,df2],ignore_index=True)# 忽略原索引,创建新索引# 处理不同列的情况df_all=pd.concat([df1,df2],sort=False)# 保留所有列,缺失值填充NaN横向合并(添加列):
# 简单横向合并(要求行数相同)df_combined=pd.concat([df1,df2],axis=1)