Pandas数据操作常用方法
发布时间:2020-08-31 22:29:58
作者:ynkulusi
#读取csv文件,只读取指定列名的内容
dft=pd.read_csv('/home/kulusi/conVdata/JHU_CSSE/05-06-2020.csv',usecols=['Country_Region','Confirmed','Deaths','Recovered'])
#把有重复值(包含类别型数据)的object字符串类型转换成category类别类型,可以降低内存占用量
dft=pd.read_csv('/home/kulusi/conVdata/JHU_CSSE/05-06-2020.csv',usecols=['Country_Region','Confirmed','Deaths','Recovered'],dtype={'Country_Region':'category'}) #usecols(列表)和dtype(字典)的值可以用变量传递进去
df.info(memory_usage='deep') #查看数据帧df的内存占用量
data=pd.read_csv('pathtofile', sep=' ',index=False) #指定分隔符读取csv文件,并且不显示索引列
data=pd.read_csv('pathtofile', header=None) #读取无标题行的csv文件
data=pd.read_csv('static/realstock.csv', converters={'code': str}) #读取文件时把指定列的类型转换位指定类型
pd.concat(stock_df_list) 把数据帧组成的列表stock_df_list合并成一个数据帧,默认按行axis=0合并
data=pd.concat((pd.read_csv(file) for file in sorted(glob('/path/to/dffile?.csv')),ignore_index=True,axis='index') #利用python内置函数glob批量读取文件然后再合并,重置索引值;axis不设置默认是index,可以设置按列合并,即axis='columns'
pd.DataFrame(np.random.rand(5,8)) #随机生成5行8列的数据帧
df=df.rename({0:'col1',1:'col2',2:'col3'},axis='columns') #重命名部分列名称;axis可以是数值1或者字符columns
df=df.rename({0:'col1',1:'col2',2:'col3'},axis=0) #重命名部分行名称;axis可以是数值0或者字符rows或者字符index
df.columns=['列'+str(i) for i in range(0,len(df.columns))] #重命名所有columns名称
df.add_prefix('x_') #给列名添加前缀字符x_ ;不更改原df的列名
df.add_suffix('_y') #给列名添加后缀字符_y ;不更改原df的列名
df.loc[::-1].reset_index(drop=True) #按行倒序df内容并重置index值;不更改原df内容
df.loc[:,::-1] #按列倒序df内容;不更改原df内容
df.dtypes #查看df的数据类型
df.select_dtypes('number') #查看类型是数值型的内容;或者df.select_dtypes(include='number')
df.select_dtypes(include='object') #查看类型是字符串类型的列;datetime:时间类型,category:分类类型
df.select_dtypes(include=['object','number','datetime','category']) #查看多种类型的列
df.select_dtypes(exclude=['number','category']) #使用 exclude 关键字排除指定的数据类型
df.astype({'列7':'object','列5':'int'}) #转换指定列的类型
df.apply(pd.to_numeric, errors='ignore') #把df的所有列都转换成数值类型,不能转换的忽略;errors='coerce'表示不能转换的,值强制设为NaN
df[df['Province_State'].isnull()] #获取某列为空值的内容;df.loc[df.Province_State.isna()];df[df.Province_State.isna()]功能同样
df[df['Province_State'].notnull()] #获取某列不为空值的内容;df.dropna(axis=1)
df.isna().sum() #统计各列缺失值(空值)行数;isna() 生成一个由 True 与 False 构成的 DataFrame,sum() 把 True 转换为 1, 把 False 转换为 0。
df.isna().mean() #可以用 mean() 函数,计算缺失值(空值)占比。
df.dropna(axis='columns') #用 dropna() 删除有缺失值(空值)的列
df.dropna(axis='index') #用 dropna() 删除有缺失值(空值)的行
df.describe() #计算数据帧每列数据对象的count,mean,std,min,max,以及一定比率的值
df.describe().loc['min':'max'] #只显示数据帧每列数据对象的min到max行
df.describe().loc['min':'max','a':'c'] #只显示数据帧min到max行的a列到c列内容
DataFrame可以通过set_index方法,可以设置单索引和复合索引。
DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)
append添加新索引,drop为False,inplace为True时,索引将会还原为列
df.set_index('A') #设置df的索引列为列名是A的列
df.set_index(['A','B']) #设置df的索引列为列名是A和B列
reset_index可以还原索引,从新变为默认的整型索引
DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill=”)
level控制了具体要还原的那个等级的索引
drop为False则索引列会被还原为普通列,否则会丢失
df.reset_index() #还原df的原索引列
df.Confirmed.mean() #查看数据帧df中Confirmed列的平均值
df.Confirmed.quantile(0.95) #查看数据帧df中Confirmed列的比率在95%的值
df.Country_Region.value_counts() #查看df中Country_Region列每个值出现的次数
df.fillna(value=xxx) #把所有为NaN的值都设置为一个固定值xxx,xxx要符合当前列值的类型
系列转成列表
list(series)
series.tolist()
series.to_list()
sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')
df.sort_index(axis=1) #按列名称排序,axis=0/rows/index或空表示按行索引排序
df.sort_index(axis="index",asecending=False) #按行索引降序排序
pd.sort_values("xxx",inplace=True)
表示pd按照xxx这个字段排序,inplace默认为False,如果该值为False,那么原来的pd顺序没变,只是返回的是排序的
dataframe.sort_values('column_name') #按指定列排序
df.sort_values(by=['col1'])
df.sort_values(by=['col1', 'col2']) #先按col1,再按col2排序
df.sort_values(by='col1', ascending=False) #降序排列
df.sort_values(by='col1', ascending=False, na_position='first') #空值排在前面,na_position : {'first', 'last'}, default 'last'
过滤:
data3=data2.loc[:,['Country_Region','Confirmed','Recovered','Deaths']] #选取指定多个列名的内容
data3.loc[data3.Country_Region=='United Kingdom'] #根据列名查找指定行
data3[data3.Country_Region=='United Kingdom'] #跟上行同效果
data3.loc[data3.Confirmed>=1000] #根据列名Confirmed来过滤统计
data3.loc[(data3.Confirmed>=10000) & (data3.Deaths>=1000)] #多条件在逻辑操作符两边需要用小括号套起来
data3[data3['Province/State'].isnull()] #过滤某列值是空的内容
data3[data3['Province/State'].notnull()] #过滤某列值不是空的内容
data3.query('Confirmed>=1000') #单条件查询
data3.query('Confirmed>=10000 & Deaths>=1000') #多条件与查询
data3.query('Confirmed>=10000 | Deaths>=1000') #多条件或查询
df[df['state'].isin(['NY', 'TX'])] #找出df中’state'列值为'NY'和'TX‘的内容
df[-df['state'].isin(['NY', 'TX'])] #上面取反,-可以是~
df[df['name'].str.contains('yo')] #找出字段name中包含字符yo的内容(模糊匹配,像SQL中的like)
df.loc[df['age'].idxmax()]['name'] #找出age值最大的记录的name值
df.loc[df['age'].idxmin()]['name'] #找出age值最小的记录的name值
pd.cut(df['age'], 5, labels=False) #根据age值把df数据5等分
df[['name','age']].nlargest(3, 'age') #找出df数据中age值最大的三条记录的name和age值
df[['name','age']].nsmallest(3, 'age') #找出df数据中age值最小的三条记录的name和age值
df.pivot_table(index='sex',columns='Pclass',values='Survived',aggfunc='mean',margins=True) #pivot_table使用透视表,可以直接指定索引、数据列、值与聚合函数。把sex设置为索引,Pclass设置为列字段,以Survived为值求平均值,margins=True可为透视表添加行与列的汇总。把聚合函数 mean 改为 count,就可以生成交叉表。
df.stack().unstack(0) #行列位置互换
df.to_dict('list') #按列名为字典key值把数据帧转换成字典
df.loc[df.color == 'blue','height'] = 199 修改列名color为blue的行的height值为199
df.loc[df2['color']=='blue', 'height'] = 175 #功能同上
df.groupby('color').sum() #分组并求和
data3['HealRate']=data3.apply(lambda x: round(x.Recovered/x.Confirmed,4),axis=1) #新增一列,值通过其他列计算得来
data3['healrate'] = round(data3['Recovered']/data3['Confirmed'], 4) #功能同上一行
df.append(s, ignore_index=True) #把series的一行数据s新加到数据帧df中
df.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
data3.drop(index='HealRate',axis=0,inplace=True) #删除行索引(index,或者用labels=)为'HealRate'的行,在原内容(inplace=True)上删除
data.drop([1,3],axis=1) #删除列名为1,3的两列
data.drop(index=['a','c']) #删除索引名称为a和c的两行
df1.drop(labels=range(1,4),axis=0) # axis=0 表示按行删除,删除索引值是第1行至第3行的正行数据
df1.drop(labels='gender',axis=1) # axis=1 表示按列删除,删除gender列
iloc的用法完全和numpy中的数字索引一样,开闭区间的逻辑也和Python是相同的
df.iloc[num] #截取数据帧df第(num+1)行内容
df.iloc[:num] #截取数据帧df第num行前各行内容
df.iloc[:,[m,n]] #截取数据帧所有行第m和第n列内容
df.iloc[row,column] #截取数据帧df第(row+1)行的第(column+1)列的单个内容
df.iloc[row:,:column] #截取数据帧df第(row+1)行及以后各行的前column)列内容
df.iloc[:,num:] #截取数据帧df所有行的第(num+1)列到最后一列;逗号前面用来表示行索引,逗号后面用来表示列索引
loc索引的开闭区间机制和Python传统的不同,而是与MATLAB类似的双侧闭区间,即只要出现,就会包含该标签
df.loc[0:3,'a':'c'] #数字也可以放入loc中当做索引,但是这时数字指的是标签而不是位置
df.loc[df.loc[:,'a']>1] #loc也可以接受布尔索引来取出其中的一些行
loc、iloc、at、iat说明
1.loc和iloc函数都是用来选择某行的,iloc与loc的不同是:iloc是按照行索引所在的位置来选取数据,参数只能是整数。而loc是按照索引名称来选取数据,参数类型依索引类型而定;
2.at和iat函数是只能选择某个位置的值,iat是按照行索引和列索引的位置来选取数据的。而at是按照行索引和列索引来选取数据;
3.loc和iloc函数的功能包含at和iat函数的功能。
Pandas合并/连接
Pandas具有功能全面的高性能内存中连接操作,与SQL等关系数据库非常相似。
Pandas提供了一个单独的 merge() 函数,作为DataFrame对象之间所有标准数据库连接操作的入口 -
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True)
在这里,有以下几个参数可以使用 -
left - 一个DataFrame对象。
right - 另一个DataFrame对象。
on - 列(名称)连接,必须在左和右DataFrame对象中存在(找到)。
left_on - 左侧DataFrame中的列用作键,可以是列名或长度等于DataFrame长度的数组。
right_on - 来自右的DataFrame的列作为键,可以是列名或长度等于DataFrame长度的数组。
left_index - 如果为 True ,则使用左侧DataFrame中的索引(行标签)作为其连接键。 在具有MultiIndex(分层)的DataFrame的情况下,级别的数量必须与来自右DataFrame的连接键的数量相匹配。
right_index - 与右DataFrame的 left_index 具有相同的用法。
how - 它是 left , right , outer 以及 inner 之中的一个,默认为内 inner 。 下面将介绍每种方法的用法。
sort - 按照字典顺序通过连接键对结果DataFrame进行排序。默认为 True ,设置为 False 时,在很多情况下大大提高性能。
合并使用“how”的参数
如何合并参数指定如何确定哪些键将被包含在结果表中。如果组合键没有出现在左侧或右侧表中,则连接表中的值将为 NA 。
这里是 how 选项和SQL等效名称的总结 -
合并方法 SQL等效 描述
left LEFT OUTER JOIN 使用左侧对象的键
right RIGHT OUTER JOIN 使用右侧对象的键
outer FULL OUTER JOIN 使用键的联合
inner INNER JOIN 使用键的交集
分类:python
评论数:0
阅读数:849