• 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
    标签: pandas
    评论数:0 阅读数:849