【Python】Pandas笔记(更新ing)


数据结构

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)

发布了154 篇原创文章 · 获赞 45 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_36622009/article/details/104597307