数据创建
代码 | 作用 |
---|---|
pd.Series([1, 2, 3, 4, 5]) | list创建Series |
dates = pd.date_range(‘20171022’, periods=6) | 创建时间索引 |
pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list([‘c1’, ‘c2’, ‘c3’, ‘c4’])) | 列标签 |
pd.DataFrame.from_dict({“A”:1, “B”:2, “C”:3}, orient=‘index’).T | 字典创建DataFrame |
数据读写
代码 | 作用 |
---|---|
df = pd.DataFrame(pd.read_csv(‘input.csv’,header=1)) | 读取csv |
df = pd.DataFrame(pd.read_excel(‘input.xlsx’)) | 读取xlsx |
df_inner.to_csv(‘output.csv’) | 写入CSV |
df_inner.to_excel(‘output.xlsx’, sheet_name=‘sheet1’) | 写入Excel |
- 设置列名dataframe.columns=[‘col1’,‘col2’,‘col3’]
- 设置索引dataframe.set_index(“col_name”)
read_csv有很多参数,挑几个常用的:
- sep: 指定分割符,默认是’,’
- header: 指定第几行作为列名,如果没有指定列名,默认header=0; 如果指定了列名header=None
- names 指定列名,如果文件中不包含header的行,应该显性表示header=None
- dtype: 指定列数据类型 E.g. {‘a’: np.float64, ‘b’: np.int32}
- nrows: int 读取的行数 E.g.pd.read_csv(file_path,skiprows=9,nrows=10)
- parse_dates 合并1,3列作为一个日期列使
数据查看
代码 | 作用 |
---|---|
df.shape() | 维度 |
df.info() | 数据表基本信息(维度、列名称、数据格式、所占空间等) |
df.dtypes() | 列数据的格式 |
df[‘Name’].dtype() | 某一列数据类型 |
df.isnull( obj ) df.isna( obj ) | 查看空值 |
df[‘Name’].unique() | 某一列的唯一值 |
df.values() | 数据表的值 |
df.columns() | 列名称 |
df.head( n=5 ) | 查看前n/5行数据 |
df.tail( n=5 ) | 查看后n/5行数据 |
- 有的资料说head()和tail()默认是查看前后的10行,可能是版本问题,我这里是python3.8.1, pandas1.0.1
- df.isna(obj)参数obj可以是series,list,DatetimeIndex,dataframe等
数据操作
代码 | 作用 |
---|---|
df.fillna(value=0) | 数字0填充空值 |
df[‘prince’].fillna(df[‘prince’].mean()) | 使用列prince的均值对NA进行填充 |
df[‘city’]=df[‘city’].map(str.strip) | 清除city字段的字符空格 |
df[‘city’]=df[‘city’].str.lower() | 大小写转换 |
df[‘price’].astype(‘int’) | 更改数据格式 |
df.rename(columns={‘category’: ‘category-size’}) | 更改列名称 |
df[‘city’].replace(‘sh’, ‘shanghai’) | 数据替换 |
df.dropna(how=‘any’) | 去掉包含缺失值的行 |
数据提取
代码 | 作用 |
---|---|
df.loc[:, [‘chrom’, ‘q_value’]] | 索引+列标签切片 |
df.loc[0, [‘chrom’]] df.loc[0, ‘chrom’] df.at[0, ‘chrom’] df.iloc[1, 1] df.iat[1, 1] | 提取一个标量 |
df.iloc[3] df.loc[3] | 提取一行 |
df.iloc[0:5] df.iloc[3:5, 0:2] df.iloc[[1, 2, 4], [0, 2]] df.iloc[1:3, :] df_inner.ix[:‘2013-01-03’,:4] | 提取区域 |
df[‘city’].isin([‘beijing’]) | 判断city列的值是否为北京 |
df.loc[df[‘city’].isin([‘beijing’,‘shanghai’])] | 判断city列里是否包含beijing和shanghai,然后将符合条件的数据提取出来 |
pd.DataFrame(category.str[:3]) | 提取前三个字符,并生成数据表 |
df.loc[:, [‘chrom’, ‘q_value’]] | 索引+列标签切片 |
数据筛选
代码 | 作用 |
---|---|
df.loc[(df_inner[‘age’] > 25) & (df[‘city’] == ‘beijing’), [‘id’,‘city’,‘age’,‘category’,‘gender’]] | 使用“与”进行筛选 |
df.loc[(df_inner[‘age’] > 25) | (df[‘city’] == ‘beijing’), [‘id’,‘city’,‘age’,‘category’,‘gender’]].sort([‘age’]) df.loc[(df[‘city’] != ‘beijing’), [‘id’,‘city’,‘age’,‘category’,‘gender’]].sort([‘id’]) | 使用“非”条件进行筛选 |
df.loc[(df[‘city’] != ‘beijing’),[‘id’,‘city’,‘age’,‘category’,‘gender’]].sort([‘id’]).city.count() | 对筛选后的数据按city列进行计数 |
df.query(‘city == [“beijing”, “shanghai”]’) | 使用query函数进行筛选 |
df.query(‘city == [“beijing”, “shanghai”]’).price.sum() | 对筛选后的结果按prince进行求和 |
数据统计
代码 | 作用 |
---|---|
df_inner.groupby(‘city’).count() | 对所有的列进行计数汇总 |
df_inner.groupby(‘city’)[‘id’].count() | 按城市对id字段进行计数 |
df_inner.groupby([‘city’,‘size’])[‘id’].count() | 对两个字段进行汇总计数 |
df_inner.groupby(‘city’)[‘price’].agg([len,np.sum, np.mean]) | 对city字段进行汇总,并分别计算prince的合计和均值 |
df_inner.sample(n=3) | 简单的数据采样 |
weights = [0, 0, 0, 0, 0.5, 0.5]df_inner.sample(n=2, weights=weights) | 手动设置采样权重 |
df_inner.sample(n=6, replace=False) | 采样后不放回 |
df_inner.sample(n=6, replace=True) | 采样后放回 |
df_inner.describe().round(2) | 数据表描述性统计 |
df_inner[‘price’].std() | 计算列的标准差 |
df_inner[‘price’].cov(df_inner[‘m-point’]) | 计算两个字段间的协方差 |
df_inner.cov() | 数据表中所有字段间的协方差 |
df_inner[‘price’].corr(df_inner[‘m-point’]) | 两个字段的相关性分析 相关系数在-1到1之间,接近1为正相关,接近-1为负相关,0为不相关 |
df_inner.corr() | 数据表的相关性分析 |
操作数据表结构
代码 | 作用 |
---|---|
df.set_index(‘id’) | 设置索引列 |
df.sort_values(by=[‘age’]) | 按照 age 列排序 |
df.sort_index() | 按照索引列排序 |
df[‘group’] = np.where(df_inner[‘price’] > 3000,‘high’,‘low’) | 如果prince列的值>3000,group列显示high,否则显示low |
df.loc[(df[‘city’] == ‘beijing’) & (df[‘price’] >= 4000), ‘sign’]=1 | 对复合多个条件的数据进行分组标记 |
pd.DataFrame((x.split(’-’) for x in df[‘category’]),index=df.index,columns=[‘category’,‘size’])) | 对category字段的值依次进行分列,并创建数据表,索引值为df_inner的索引列,列名称为category和size |
df=pd.merge(df_inner,split,right_index=True, left_index=True) | 将完成分裂后的数据表和原df_inner数据表进行匹配 |
df.reset_index() | 重设索引 |
df=df.set_index(‘date’) | 设置日期为索引 |
数据表合并
代码 | 作用 |
---|---|
df=pd.merge(df,df1,how=‘inner’) | 内连接(取两个集合的交集) |
df_left=pd.merge(df,df1,how=‘left’) | 左连接(以 df 为基准,df1 在 df 中无匹配则为空) |
df_right=pd.merge(df,df1,how=‘right’) | 右连接(以 df1 为基准,df 在 df1 中无匹配则为空) |
df_outer=pd.merge(df,df1,how=‘outer’) | 全连接(取两个集合的并集,包含有 df , df1 的全部数据行,无匹配则填充空) |
修改列名
代码 | 作用 |
---|---|
a.columns = [‘a’,‘b’,‘c’] | 列名全部修改 |
a.rename(columns={‘A’:‘a’}, inplace = True) | 修改部分列名 |
细节总结
inplace参数
pandas 中 inplace 参数在很多函数中都会有,它的作用是:是否在原对象基础上进行修改
inplace = True:不创建新的对象,直接对原始对象进行修改;
inplace = False:对数据进行修改,创建并返回新的对象承载其修改结果。
默认是False,即创建新的对象进行修改,原对象不变,和深复制和浅复制有些类似。
E.g.:df.drop([“A”],axis=1,inplace=True)