数据结构
1.Series
Series是一种类似于一维数组的对象,它由一组数据(不同数据类型)以及一组与之相关的数据标签(即索引)组成。
(1)创建Series:
#【1】从Python列表创建,索引默认为从0开始的数字
s1=pd.Series([1,'a',5.2,7])
#【2】自定义标签索引
s2=pd.Series([1,'a',5.2,7],index=['d','b','a','c'])
s2.index#返回index的list
#【3】用Python字典创建Series
sdata={'a':1,'b':2}
s3=pd.Series(sdata)
(2)获取属性:
s1.index#返回start、stop、step
s1.values#返回一个array
(3)查询数据:
s2['a']#使用标签索引。查询单个值,返回一个值
s2[['a','b']]#查询多个值,返回Series
2.DataFrame
DataFrame是一个表格型的数据结构:每列可以是不同的值类型(数值、字符串、布尔值等)。既有行索引index,也有列索引columns。可以被看做是由Series组成的字典。
(1)创建DataFrame:
(2)获取属性:
df.dtype#每列数据的类型
df.columns#列索引
df.index#行索引
(3)修改属性:
df.rename(columns={'a':'new'})
df.columns={'a':'new'}
df.set_index()
(4)查询数据:
df['year']#查询一列/行数据。返回Series
df[['year','pop']]#查询多列/行数据。返回DataFrame
df.loc[1]#查询一行。返回Series
df.loc[1:3]#查询多行。返回DataFrame
查询数据
1.df.loc方法:根据行列的标签值查询
(1)使用单个label值查询:行或者列,都可以只传入单个值,实现精确匹配
df.loc['2018-01-01','bWendu']#查询行、列索引,返回一个值
df.loc['2018-01-01',['bWendu','yWendu']]#指定一行,多列,返回一个Series
(2)使用值列表批量查询:
df.loc[[1,2,3],'bWendu']#指定多行,一列,返回Series
df.loc[[1,2,3],['b','a']]#指定多行、多列,返回DataFrame
(3)使用数值区间进行范围查询
df.loc[1:3,'a']#指定行区间,一列,返回Series
df.loc[1,'a':'b']#指定列区间,一行,返回Series
df.loc[1:3,'a':'b']#指定多行多列区间,返回df
(4)使用条件表达式查询
df.loc[df['b']<-10,:]#指定行的条件(某一列的值<-10),所有列
df.loc[(df['a']<=30 & df['b']>=15),:]#组合条件用&合并
(5)调用函数查询
df.loc[lambda df:(df['b']<=30),:]#使用lambda表达式
#使用自己编写的函数,作为查询条件
def query_my_data(df):
return df.index.str.startswith("2018-09")&df['b']==1 #返回符合条件的行
df.loc[query_my_data,:]
2.df.iloc方法:根据行列的数字位置查询
3.df.where方法
4.df.query方法
新增数据列
1.直接赋值
df.loc[:,'new']=df['a']-df['b']#选择所有行、新的列,设为指定值
2.df.apply方法
def get_type(df):
if df['a']>33:
return 'A'
else:
return 'B'
df.loc[:,'new']=df.apply(get_type,axis=1)##选择所有行、新的列,设为指定值
3.df.assign方法:可以同时添加多个新的列
df.assign(
new=lambda m_df:m_df['a']*9,
new2=lambda m_df:m_df['b']*3
)
4.按条件选择分组分别赋值
df['new']=''#先创建空列
df.loc[df['a']>10,'new']='A'#指定行的条件,设置符合条件的行的新列的值
数据统计函数
1.汇总类统计
df.describe()#一下子提取所有数字列的统计结果:count、mean、std、min、25%、50%、75%、max
df['b'].mean()#查看单个数字列的数据:还有max()、min()
2.唯一去重和按值计数:
#唯一去重一般不用于数值列,而是枚举、分类列
df['fengxiang'].unique()#返回该列的所有独立值
#按值计数
df['fengxiang'].value_counts()#返回该列每种值的个数。是一个Series
3.相关系数和协方差
df.cov()#协方差矩阵
df.corr()#相关系数矩阵
df['a'].corr(df['b'])#a列和b列的相关系数
数据排序
1.Series的排序:sort_values(ascending=True,inplace=False) 默认升序,不修改原始
s1.sort_values()
df['a'].sort_values()#返回该列一个副本
2.DataFrame的排序:sort_values(by,ascending=True,inplace=False) 默认升序,不修改原始
df.sort_values(by='a')#单列排序。返回df的一个副本
df.sort_values(by=['a','b'])#多列排序,默认都是升序。
df.sort_values(by=['a','b'],ascending=[True,False])#多列排序,每列指定升序与否
数据合并concat
- 使用场景:批量合并相同格式的excel、给DataFrame添加行、给DataFrame添加列
- concat语法说明:使用某种合并方式(inner/outer),沿着某个轴(axis=0/1),把多个pd对象(s/df)合并成一个。
- concat函数:pandas.concat(objs,axis=0,join=‘outer’,ignore_index=False)
- append函数:DataFrame.append(other,ignore_index=False)
1.用Pandas.concat函数合并数据:
pd.concat([df1,df2])#【1】合并2个df。默认按行合并。外连接。包含索引。
pd.concat([df1,df2],ignore_index=True)#【2】忽略原本的索引。变成新的索引。
pd.concat([df1,df2],ignore_index=True,join='inner')#【3】内连接,两个df的列要相同才会被合并。
添加新列:
pd.concat([df1,s1],axis=1)#【1】axis为1就是添加新列
pd.concat([df1,s1,s2],axis=1)#【2】给df添加多个Series。顺序可以调换。
pd.concat([s1,s2],axis=1)#【3】多个Series合并为DataFrame
2.用DataFrame.append按行合并数据:
df1.append(df2)#【1】给1个df添加另一个df(按行)
df1.append(df2,ignore_index=True)#【2】忽略原来的索引
#【3】一行行给df添加数据
pd.concat(
[pd.DataFrame([i],columns=['A']) for i in range(5)],ignore_index=True
#添加一列数据:从0到4
)
数据拼接Merge
merge的语法:
pd.merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=True,suffixes=('x','y'),copy=True,indicator=False,validate=None)
- left,right:要merge的dataframe或者有name的Series
- how:join类型,有’left’,‘right’,‘outer’,‘inner’
- on:join的key,left和right都需要有这个key
- left_on:left的key
- right_on:right的key
- left_index,right_index:使用index而不是普通的column做join
- suffixes:两个元素的后缀,如果列有重名,自动添加后缀,默认是(‘x’,‘y’)
分组聚合
groupby:先对数据分组,然后在每个分组上应用聚合函数、转换函数
1.分组使用聚合函数做数据统计
(1)单个列groupby,查询所有数据列的统计
df.groupby('A').sum()#按照A列数据分组,在每个分组上求所有列的和
(2)多个列groupby,查询所有数据列的统计
df.groupby(['A','B']).mean()#按照A列、B列数据分组,在每个分组上求所有列的平均值
df.groupby(['A','B'],as_index=False).mean()#分组后,不把A、B列作为索引
(3)同时查看多种数据统计
df.groupby('A').agg([np.sum,np.mean,np.std])#查找分组后,所有列的多种统计值。列会变成多级索引。
(4)查看单列的多种结果数据
#【1】先确定单列,再统计
df.groupby('A')['C'].agg([np.sum,np.mean,np.std])#先用A的值分组后,查看C单列的统计结果
#【2】先统计,再查询单列(相对性能较低)
df.groupby('A').agg([np.sum,np.mean,np.std])['C']
(5)不同列使用不同的聚合函数
df.groupby('A').agg({"C":np.sum,"D":np.mean})
2.遍历groupby的结果:for循环可以直接遍历每个group
(1)遍历单个列聚合的分组
g=df.groupby('A')
for name,group in g:#遍历按照A的值分的各个组
print(name)#name就是分组时A的值
print(group)#group是该组对应的各个列的值
(2)获取单个分组的数据:
g.get_group('bar')#参数是该分组的名字,即分组列里面对应的值
(3)遍历多个列聚合的分组:
g=df.groupby(['A','B'])
for name,group in g:#因为有二级索引,所以得到的组是A和B的分类数的乘积
print(name)#结果是:一级索引、二级索引的tuple
print(group)
g.get_group(('foo','one'))#查询时也是索引的tuple
(4)获取多列聚合分组后单个分组的数据:
g.get_group(('foo','one'))#查询时也是索引的tuple
(5)直接查询group(多列聚合分组)后的某些列,生成Series或DataFrame
g1=g['C']#按A、B分组后的C列的值
for name,group in gl:#得到的C列也是有group的,可以遍历分组
print(name)