python进阶--pandas基本功能

Posted 文仙草

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python进阶--pandas基本功能相关的知识,希望对你有一定的参考价值。

pandas官方用户手册网站

一、调用pandas

  • import pandas:导入pandas包,后续代码就可以使用pandas包里定义好的功能了。
  • import pandas as pd:
    相当于将pandas包重命名为pd,这样之后使用pandas包的功能的时候,直接写pd,而不需要写pandas,更省事。

二、打开和保存文件

(一)打开文件

1. 打开excel、csv文件
  • pd.read_csv(filepath)
import pandas as pd

filepath = 'E:\\\\python\\\\test.csv'
df = pd.read_csv(filepath)
  • pd.read_excel(filepath)
import pandas as pd

filepath = 'E:\\\\python\\\\test.xlsx'
df = pd.read_excel(filepath)
2. 打开json文件
  • json.load
import json
with open ('filename.json','r') as openfile:
    json_object = json.load(openfile)
3. 打开XML文件

python没有专门的包可以直接打开xml文件,可以parse

import pandas as pd
import xml.etree.ElementTree as etree
tree = etree.parse('filexmaple.xml')
root = tree.getroot()
columns = ['name', 'age', 'birthday']
df = pd.DataFrame(columns = columns)
for node in root:
    name = node.find('name').text
    age = node.find('age').text
    bday = node.fine('birthday').text
    

可以在打开文件的时候,将第一行设置为header(即列名称)。或者可以手动添加header

  • 设置第一行:df = pd.read_xlsx(filepath, header = 0)
  • 手动添加:df.columns = [‘name’, ‘class’, ‘age’]

(二)保存文件

  • df.to_csv(filepath&name)
    将文件保存为csv格式,注意不要忘记写后缀
    如果参数index = False,表示行名称不会被保存.
df.to_csv('new_file.csv')
df.to_csv('E:\\\\python\\\\new_file.csv')
  • 其他文件格式的打开和保存
Data FormateReadSave
csvpd.read_csv()df.to_csv()
jsonpd.read_json()df.to_json()
excelpd.read_excel()df.to_excel()
hdfpd.read_hdf()df.to_hdf()
sqlpd.read_sql()df.to_sql()

三、初查和清理数据

(一)初查数据

  • df.head(): 展示前五行数据
  • df.tail(): 展示后五行数据
  • df.info(): 展示df的基本信息,包括列名及数据类型、每列非Na数据的计数、内存使用等。
  • df[‘name’].unique(): 剔除该列数据的重复项。
  • df.describe(): 展示数据类型为数字(int, float)的列数据的统计信息,比如计数、平均值、最大值、最小值、方差等;
  • df.describe(include = ‘all’)用于展示所有列数据(包括非数据类型的列数据)的统计信息,对于非数字类型的列数据,平均值、最大值、最小值等返回NaN。
  • df.dtypes: 查看各列数据的数据类型
  • df[‘column_name’].value_counts(): 查看该列中各值出现的次数。
  • df[‘column_name’].value_counts().idxmax():查看该列中数值出现最高的。
df['door_num'].value_counts()
#结果
#four    114
#two      89
#Name: num-of-doors, dtype: int64
df['door_num'].value_counts().idxmax()
#结果
#'four'

(二)清理数据

  • 修改index列:将df的index修改为df中的’Date’列
    • df.index = df[[‘Date’]]
    • df.set_index('Date)
  • 重置index列:df.reset_index(),将index重置为以0开头的整数
    reset_index功能里有inplace参数,inplace=True会在数据里增加一列index(如下图)


inplace=False,不会在数据里增加一列index(如下图)

  • df.columns = [“symboling”,“normalized-losses”,“make”] :添加列名称
  • df.rename(columns = ‘old-name’:‘new-name’, inplace = True):修改列名称,将old-name修改为new-name
  • df.replace(missing_value, new_value):
    df1 = df.replace(’?’,np.NaN) :将数值为“?”的单元格替换为NaN,替换后的新dataframe返回给df1。该功能搭配.dropna()可用于删除缺失数据。
  • df1.dropna(subset=[“price”], axis=0, inplace = True) ,将price列中数值为NaN单元格所在行的数据整行删除。 如果axis = 1,表示删除NaN数值所在列(即price列)。inplace = True代表对df本身改动,inplace = False代表生成新的df
#删除na数据所在行,inplace=True
df1.dropna(subset=["price"], axis=0, inplace = True)
#删除na数据所在行,inplace=False
df = df1.dropna(subset=["price"], axis=0, inplace = False)
#因为删除了na列,所以重置index列
df.reset_index()
  • df.astype(): 修改数据类型。
#price列的数据类型修改为int。
df['price'] = df['price'].astype(int)
#或者也可以
df[['price']] = df[['price']].astype(int)
#修改bore和stroke两列的数据类型
df[["bore", "stroke"]] = df[["bore", "stroke"]].astype("float")

示例1 - 将列名为stroke列中的缺失数据替换成该列的平均值

#由于不确定该列数据的数据类型是否为数字,所以先将该列数据的数据类型修改为float
avg_stroke = df['stroke'].astype('float').mean(axis = 0)
#print(avg_stroke)
df['stroke'].replace(np.nan, avg_stroke, inplace = True)

(三)数据标准化和标注

1、simple scaling

将不同范围大小的数据进行标准化,使其范围控制住0-1之间,从而使不同范围的数据具有可比性。常见方法是用原数据除以该列数据的最大值,即用 (原数据)/(数据最大值)替换原数据

# 用(original value)/(maximum value)替换original value
df['length'] = df['length']/df['length'].max()
df['width'] = df['width']/df['width'].max()
2、数据分组

将连续数据按照一定规则进行分组,使原连续数据离散。

  • 使用numpy的函数np.linspace(start_value, end_value, numbers_generated),设定范围和组数
  • group_names = [‘Low’, ‘Medium’, ‘High’]创建各组名称
  • 利用pandas里的cut函数,将列中的数值划分至设定好的组别中。
#将horsepower列分成3组,以最小值开始,以最大值结束,分三组,所以需要4个切割点)
bins = np.linspace(min(df["horsepower"]), max(df["horsepower"]), 4)
bins
#结果:创建的3个组别的边界值
#array([ 48.        , 119.33333333, 190.66666667, 262.        ])

group_names = ['Low', 'Medium', 'High']
df['horsepower-binned'] = pd.cut(df['horsepower'], bins, labels=group_names, include_lowest=True )
df[['horsepower','horsepower-binned']].head(5)

运行结果

horsepowerhorsepower-binned
0111Low
1111Low
2154Medium
3102Low
4115Low
3. indicator variable(也称为dummy variable)

An indicator variable (or dummy variable) 是一种用数值对变量进行标注的方式(例如:在员工统计中将男性标为1,女性标为0)。这种方法被称为“dummy”,是因为用于标注的数据与数值本身的含义没有关系。这种数据标注方法常用于回归分析。

函数 pd.get_dummies(需要打标的列)

df['fuel-type'].value_counts()
#结果:fuel-type列有两个值gas和diesel
#gas       181
#diesel     20
#Name: fuel-type, dtype: int64

#对fuel-type列进行标注,即

四、创建DataFrame

  • 将字典变成DataFrame结构:key是列名,value是每列数值 python student = 'name': ['Eva', 'Bob', 'John','Cathy', 'Kate'], 'age': ['15', '16', '15','17','16'], 'gender': ['f', 'm', 'f', 'f', 'm'] student_df = pd.DataFrame(student)

五、常用方法

(一)从DataFrame结构的数据中选取一列数据

  1. 直接选取,Series格式:df[‘列名’] (注意:是一个方括号)

    1. 按dataframe格式:df[[‘列名’]] (注意:是两个方括号)

(二)从DataFrame结构的数据中选取多列数据

格式:df[[‘列名1’,‘列名2’,‘列名3’]] ,注意是两个方括号

如果只有一个方括号会报错

(三)获取第n行、第m列单元格的数值

  1. 用数字定位:df.iloc[n,m]
    注意:标题列不算行数,行数据和列数据的序号n、m均从0开始,所以获取第一行、第一列单元格数据时,应该是df.iloc[0,0]

2)用列名定位获取数据
获取第二行中’Artist‘列的数据(注意,此处的第二行是指实际数据的第二行,而其行序号为1),如图

(四)获取多行多列数据(数据切片)

  1. 用序号:df.iloc[i:j, n:m]
    例如获取第1到2行、1到3列的数据,如下图:

    上图获取的数据在整个数据表中的位置如下图:

  1. 用列名: df.loc[i:j, ‘列名’:‘列名’]

.loc与.iloc对行数据切片的不同之处,需特别注意!! df.loc[i:j]是获取行序号从第i行到第j行;而在使用df.iloc[i:j]时获取第i行到第j-1行数据。

如下图,df.loc[0:2, :]获取了前三行数据,而上面df.iloc[0:2,:]获取了前两行数据。

(三)选择列数据满足特定要求的行数据

df1 = df[df[‘gender’] = ‘f’]: 满足条件的返回True, 反之返回False; 为True的行被选中,为False的行被剔除。 df2 = df[df[‘age’]>16]

(四)选择满足特定值的行数据

可以对特定的列:选择A列中包含任一数值’1’,‘2’,'3’的行,df[df[‘A’].isin([‘1’,‘2’,‘3’])]
也可以对整个dataframe:df.isin([‘1’,‘2’,‘3’])
可以对多列进行筛选:df[df[某列].isin(条件)&df[某列].isin(条件)]

以上是关于python进阶--pandas基本功能的主要内容,如果未能解决你的问题,请参考以下文章

python进阶--pandas基本功能

python进阶--pandas基本功能

python进阶之---pandas

python数据分析之Pandas:基本功能介绍

进阶第十六课 Python模块之Pandas

python进阶-- numpy基本功能