python 数据分析 |3. Pandas 学习

利用Pandas库可以快速地完成数据读写、数据分片/分组统计、数据整理等操作。Pandas的所有功能都是构建在两个最基础的数据结构之上:Series与DataFrame

Series是一种类似于一维数组的对象,由一组数据,以及一组与之相关的数据标签(即索引)组成。

DataFrame是一个表格型的数据结构,包含一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame既有行索引,也有列索引,可以看作是由Series组成的字典。

目录

1.1 DataFrame

1.2 数据类型

1.3 Series

1.4 属性

1.5 方法

1.6 修改索引与列

1.7  分组、应用和聚合

1.8 数据读入 

1.9 数据合并 


1.1 DataFrame

        DataFrame有3个基本要素,它们分别是索引、列、数据。首先运行如下代码。

 # 导入Pandas库
import pandas as pd  

# 设置Jupyter Notebook中显示数据时,最多显示7行
pd.set_option('display.max_rows',7) 
# 设置Jupyter Notebook中显示数据时,最多显示6列
pd.set_option('display.max_columns',6)

# read_csv()函数来将本地目录下的数据文件Online_Retail_Fake.csv读入到一个DataFrame中
retail_data = pd.read_csv("../data/Online_retail_Fake.csv") 
# head( )函数只能读取前五行数据
retail_data.head() 

DataFrame把索引和列都当作轴(axis),一个DataFrame有一个竖轴(Index)和一个横轴(Columns)。分别用0/1来表示竖/横轴。                                                                                          在函数中指定参数axis=0的情况,就是指函数是作用于行。                                                              在函数中指定参数axis=1的情况,就是指函数是作用于列                                                   DataFrame中每一列数据要求是相同类型,但是不同列却可以是不同数据类型。对于数据缺失的情况,Pandas中采用了NaN进行表示。

index= retail_data.index  # 获取索引总行数
columns = retail_data.columns # 获取列类信息
data = retail_data.values #获取所有数据列表

1.2 数据类型

Pandas中的主要数据类型。

   DataFrame的每一列只能是一种数据类型,而不同列则可以是不同数据类型.                    

# 查看DataFrame对象中列的数据类型
retail_data.dtypes

#  查看DataFrame中每种数据类型各有几列
retail_data.dtypes.value_counts()

1.3 Series

Series就是构成DataFrame的列,每一列就是一个Series。一个Series是一个一维的数据类型,其中每一个元素都有一个标签,类似于NumPy中元素带标签的数组。标签可以是数字或字符串。如果访问DataFrame中的某一列,可以采用如下代码。

# 第一种访问方式  操作符 "[列名]"
# 访问 Country 列 ,返回一个Series,包含Index和数据,同时改Series的列名为Country
retail_data['Country']


#  第二种访问方式 操作符  ".列名"
# 不建议使用 如果对应的列名包含特殊字符,这种方法可能无效
retail_data.Country

Series运算,获取了某一列数据后,Python中支持的大部分运算操作符都可以应用于Series,代码如下。

retail_data["UnitPrice"] + 1  #  每个数据都加1,为True/False的新Series。
retail_data["UnitPrice"] * 2  #  每个数据都乘以2,
retail_data["UnitPrice"] > 2  #  将列中的每个数据与2比较,返回取值为True/False的新Series
retail_data.Country == 'France' #  字符串比较,返回取值为True/False的新Series

# 对DataFrame的列进行逻辑运算,之后赋值给新的列
retail_data['key_customer'] = retail_data["Total_price']>1000

1.4 属性

 shape属性,可查看数据 行列

df.shape

   size 属性可以查看数据总数

df.size

  ndim属性查看数据的维度

df.ndim

1.5 方法

在Pandas库中,DataFrame和Series的很多操作都将返回一个新的DataFrame或Series,此时我们又可以对新的DataFrame和Series进行方法调用

如果想直接在原DataFrame上修改,通常只需要在函数中加上参数inplace=True就可以了。

head()函数查看数据的前5行  tail()函数查看数据的后5行

df.head()
df.tail()

dtypes() 函数获取DataFrame的每一列的数据类型

df.dtype()

memory_usage(deep=True) 函数,是对数据所占内存进行精确统计

# deep=True参数 代表是否计算引用的对象的内存使用情况
men = df.memory_usage(deep=True)

# 转换为兆字节显示
round(men.sum()/(1024*1024))

info() 函数获取元数据信息是数据的类型、占用内存大小信息

df.info()

value_counts()方法统计某列有多少重复值

#  先获取了CustomerID列,并将其赋值给了一个新变量customers
customers= retail_data["CustomerID"]

#  用value_counts()方法统计某列有多少重复值
customers.value_counts()

nunique() 统计DateFrame中每列的不同值的个数 

df.nunique()

astype() 函数 用于转化dateFrame 某一列的数据类型

retail_data["Country"] = retail_data["Country"].astype('category')

isnull() 函数 用来对DataFrame或Series中的缺失值进行统计

notnull()函数判断是否存在缺失值

# isnull()  notnull()函数判断是否存在缺失值
retail_data['UnitPrice'].isnull()
retail_data['UnitPrice'].notnull()


#  调用sum()函数,该函数将对Series的值的总和
retail_data['UnitPrice'].isnull().sum()

mean()函数用求平均值函数,来获取缺失数据所占比例

# 用求平均值函数mean()来获取缺失数据所占比例
# df.mean(0) 按列求平均值
# df.mean(1) 按行求平均值
retail_data['UnitPrice'].isnull().mean()

mode() 函数 获取沿选定轴的众数

# 获取数据中最常出现的数
# df.mean(0) 按列获取
# df.mean(1) 按行获取
retail_data['UnitPrice'].mode()

fillna()函数对缺失数据进行填充

#  利用fillna()函数对缺失数据进行填充
retail_data['UnitPrice'].fillna(0)

#  填充时指定limit,每列最多填充 3次
retail_data['UnitPrice'].fillna(0,limit=3)

# 均值填充
retail_data['UnitPrice'].fillna(retail_data['UnitPrice'].mean(), limit=3)


# 用前值填充
retail_data['UnitPrice'].fillna(retail_data['UnitPrice'].mean(), limit=3)

# 用后值填充
retail_data['UnitPrice'].fillna(method='bfill')

# 手工补充值  指定索引标签处的值用指定值来代替的功能
fill_values = pd.Series([1,2],index=['b','c'])
df['c4'].fillna(fill_values)

interpolate() 函数插值函数来完成缺失值的补齐

# 不考虑索引因素插入
df.interpolate()

# 考虑时间插入 method="time"
df.interpolate(method="time")

# 非时间索引也可以采用类似方法指定参数method='values'
df.interpolate(method='values')

数据是倒序排列,所以需要按照索引重新排序

# 按照索引排序
df.sort_index()

# 按照数值排序 
# ascending=False参数表明是降序排列,升序则为True。
df.sort_values(ascending=False)

# 指定多列排序
df.sort_values(['Total_price','Country'],ascending=True)

pct_change() 函数用于计算某列元素与前元素之间的百分比

# 计算涨跌幅,用pct_change()函数来实现

sh = pd.read_csv("../data/sh.cvs",index_col="data")
percent = sh["close"].pct_change()
sh.head()

to_datetime()函数可以完成时间类型的转换

retail_data['InvoiceDate'] = pd.to_datetime(retail_data['InvoiceDate'])

duplicated()函数,用于查看数据是否存在重复,

# subset可以指定只针对特定列数据来判断重复,可以指定subset='CustomerID'。
#  keep参数取值可以为'first','last',False,取值为'first'代表了第一个取值不标记为重复,'last'则#  相反,False则代表只要相同就是重复

retail_data_na.duplicated()

drop_duplicates()函数可以丢弃重复数据

#  检查指定列,多列 数据,丢弃重复数据
df.drop_duplicated(['a','b'])


# 丢弃重复数据,可以选择是保留前面的数据还是后面的重复数据
df.drop_duplicated(method='last')

describe()函数默认会给出数据计数、均值、标准差、最大值、最小值和第1,2,3分位数。

# T代表求转置,即行列变换
retail_data.describe(include=[np.number]).T

# percentiles 分别指定了函数输出要显示的分位数   include 指定np.number类型的列
retail_data.describe(include=[np.number], percentiles=[.05, .10,.25, .5, .75, .9, .95]).T

# 数值类型,describe()函数输出均值等信息,其他类型,输出则是计数、不同值个数、出现频率等信息
retail_data.describe(include=[np.object]).T

nlargest(num, 'columns_name')查看一定数量的最大值

retail_data.nlargest(50,'Total_price').head()

nsmallest(num, 'columns_name')查看一定数量的最小值

retail_data.nsmallest(50,'Total_price').head()

拆分数据

melt() 将数据流从宽格式转换为长格式

#  melt 参数
#  frame:需要处理的数据框。  
#  id_vars:保持原样的数据列。不需要别转换的列名  
#  value_vars:需要被转换成变量值的数据列。 如果剩下的列全部要转换,就不用写了 
#  var_name:转换后变量的列名。 自定义设置对应列名 
#  value_name:数值变量的列名。 自定义设置对应列名 
df = pd.read_csv("../data/pew-raw.csv")
df.head(5)
formatted_df = pd.melt(df, id_vars=['religion'], var_name='income',value_name='freq')

stack()函数 即堆叠, 作用是将 列旋转到行 

unstack()函数,将行旋转到列

#  stack()函数
formatted_df = df.set_index('religion')
formatted_df = formatted_df.stack()
formatted_df.index = formatted_df.index.rename('income',level=1)
formatted_df.name = 'frep'
formatted_df = formatted_df.reset_index()
formatted_df.head()

extract() 文本数据方法

# Series.str.extract(pat,flags=0,expand=None)
# pat:字符串或正则表达式
# flags:整型
# expand: 布尔型,是否返回数据框
# returns dataFrame/索引index

df['week'] = df['week'].str.extract('(\d+)',expand=False).astype(int)

用pivot_table()函数将单列数据拆分为两列

# pivot_table()函数将原来的id、date列变换成为行的索引
df = df.pivot_table(index=["id","date"],columns="element",values="value")

# 需要利用reset_index()函数将多级索引id、date还原到列
df.reset_index(drop=False,inplace=True)

pandas.to_numeric() 将参数转换为数字类型

# 将参数转换为数字类型 
# 默认返回dtype 为float64 或int64 具体取决于提供的数据,
# arg:  scalar, list,tuple,series
# errors: {'ignore','raise','coerce'} 默认为raise 则无效的解析会发生异常,coerce 无效解析设置为# NAN , 如果为ignore 则无效的解析返回输入
# downcast {integer','signed','unsigned','float'}
# 默认为none 

pandas.to_numeric(arg, errors='raise', downcast=None)

df[["id","year","month"]] = df[["year","month","id"]].apply(lambda x:pd.to_numeric(x,errors='ignore'))

 pandas.to_datetime() 将参数转换为时间数据

# 将参数转换为时间数据
# arg
# errors: {'ignore','raise','coerce'} 默认为raise 则无效的解析会发生异常,coerce 无效解析设置为# NAN , 如果为ignore 则无效的解析返回输入
# format 格式化显示时间格式
# unit: 默认值为 ns,则将会精确到微秒,s 为秒

pandas.to_datetime(arg, errors='ignore', format="%Y%m%d")

  pandas.to_timedelta() 将参数转换为timedelta

# arg: str ,timedelta 类似list或者raise
# unit: 默认 ns  表示arg单位,可能取值 Y M W D days day  hours hour hr h m  minute min       
# minutes  T S seconds ms等 
# errors: {'ignore','raise','coerce'} 默认为raise 则无效的解析会发生异常,coerce 无效解析设置为# box: 默认为True,则返回结果的TimeDelta/Timedeltaindex

pandas.to_timedelta(arg, errors='ignore', unit="w")

pandas.DateOffset() 函数用于时间戳的加减

# pandans.DateOffset() 常用参数
# months、days、years、hours、minutes、minutes、seconds

df['date'] = pd.to_datetime(df['date.entered'])+pd.to_timedelta([df['week'],unit='w')-pd.DataOffset(weeks=1)

apply()函数,函数作为一个对象,能作为参数传递给其他函数

df[["id","year","month"]] = df[["year","month","id"]].apply(lambda x:pd.to_numeric(x,errors='ignore'))

1.6 修改索引与列

        默认的索引值,取值为0,1,…然而分析中想要的是用指定列的数据作为索引可以使用参数index_col='',在读取数据时就将某列设置为索引.。 或者在读入数据后,再使用函数set_index()修改

# 第一种方式
# 指定列作为索引 index_col("列名") 或者使用 index_col("索引")
gapminder = pd.read_csv("../data/gapminder.csv",index_col='Life expectancy')
gapminder.head()

# 第二种方式 
# 读入数据后再修改 set_index
gapminder =  pd.read_csv("../data/gapminder.csv")
gapminder=gapminder.set_index("Life expectancy")
gapminder.head()

 reset_index() 函数将索引重新恢复到列中 

# 将索引重新恢复到列中 reset_index()
gapainder.reset_index()

如何同时修改索引与列名  rename(index=" ",columns=" ",level=索引)

# 同时修改索引与列名 rename 返回的是一个新的DataFrame
gapminder = pd.read_csv("../data/gapminder.csv",index_col="Life expectancy")
idx_rename = {'Abkhazia':'Abk','Afghanistan':'Afg'}
col_rename = {'Unnamed:0':'Wrong Column','1801':'1801Y'}
gapminder_new = gapminder.rename(index=idx_rename,columns=col_rename)
gapminder_new.head()


#  修改列名位置,按照指定列名顺序排序
price_info = ["UnitPrice","Quantity","Total_price"]
invoice_info=["InvoiceNo","InvoiceDate","StockCode","Description"]
customer_info=["CustomerID","Country"]
columns_new = price_info + invoice_info + customer_info、

retail_data_new = retail_data[columns_new]
retail_data_new.head()

index和columns也可以转换为列表对象,可以通过直接将一个列表赋值给index和columns的方法来完成修改

retail_data = pd.read_csv("../data/Online_Retail_Fake.csv")
retail_data.head()
# 添加新列 只需要给该列赋值就可以完成
retail_data['Total_price'] = retail_data['UnitPrice']*retail_data['Quantity']
retail_data[['Total_price','UnitPrice','Quantity']]

获取指定列的位置 , .columns.get_loc("列名")

# 获取指定列所在位置 .columns.get_loc("列名")
totalPrice_index = retail_data.columns.get_loc("CustomerID")+1

指定位置,增加新列,采用insert(loc=' ', column=' ', value=' ')方法

retail_data.insert(loc=totalPrice_index,column="New_totalPrice",value=retail_data['Total_price'])
retail_data.head()

使用drop() 方法删除列,drop()方法返回的是一个新的DataFrame

# 删除指定列 使用 drop('列名',axis='columns')
retail_data.drop('New_totalPrice',axis='columns')

dropna()  删除存在缺失数据行

# 删除存在有缺失值的数据行
df.dropna()

# 删除整行都是缺失值的行, how='all'代表了要整行都是缺失数据才丢弃
df.dropna(how='all')

# axis=1代表了要整列都是缺失数据才丢弃该列
df.dropna(how='all',axis=1)


# 指定一个阈值 thresh,要求至少有几列数据不是缺失值
df.dropna(thresh=4)

使用del  方法删除列

# 使用 del 删除指定列
del retail_data['New_totalPrice']

#  选择多列,返回一个新的DataFrame 

# DataFrame[[ "xx","xx","xx" ]] 指定列名,选择多列,返回一个新的DataFrame 
retail_data[["Total_price", "UnitPrice","Quantity" ]]


# 根据数据类型选择多列   select_dtypes(include=[数据类型])
retail_data.dtypes.value_counts()  #查看DataFrame的包含的数据类型
retail_data.select_dtypes(include=['float64']).head()  # select_dtypes() 选择数据类型


# 根据字符串匹配选择列 filter()  有3个互斥的参数 分别为items、regex和like
# items中的列名不存在,此时不会返回KeyError错误
retail_data.filter(items=['Total_price','UnitPrice']).head()

#

选择特定行

# 读取数据并新增Total_price 列
retail_data = pd.read_csv("../data/Online_Retail_Fake.csv")
retail_data["UnitPrice"] = retail_data["UnitPrice"].fillna(retail_data["UnitPrice"].mean())
retail_data["Quantity"] = retail_data["Quantity"].fillna(retail_data["Quantity"].mode())
retail_data["Total_price"] = retail_data["UnitPrice"]*retail_data["Quantity"]

# 选择country 列
country = retail_data['Country']

#返回特定的行
# 第一种方式:使用iloc[索引下标] 返回特定行
country.iloc[0],country.iloc[7279],country.iloc[541909]

#  同时选择多行 iloc[["","",""]]
country.iloc[[0,7279,541909]]

# 切片方式选择多行
country.iloc[10:50:10]


# 第二种方式: 遇到索引不是数字,是字符的,使用.loc来选择对应的行、
college = pd.read_csv("../data/College.csv",index_col=0)
college.loc['Yale University']

# 同时访问多行 切片
college.loc["Abilene Christian University":"Alaska Pacific University":50]

同时选择行与列,rows代表了行的选择,它既可以是列表,也可以是数据切片方式的输入,columns代表了列的选择                                                                                                             df.iloc[rows, columns]                                                                                                             df.loc[rows, columns]

# df.iloc[rows, columns]      df.loc[rows, columns]
#  “:”后没有内容,那么代表直到结束;
#  前面没有内容,那么代表直到开始 
#  只是“:”,那么代表所有行或列

college.loc["Westminster College of Salt Lack City":,:"Accept"].head()

college.loc[:,['Apps',"Accept"]].head()


college.iloc[-5:,:].head()

college.iloc[-5:,[1,2]].head()

# 在不输入列的情况下,默认选择所有列
college.iloc[:5].head()

多条件筛选

使用函数比较或者比较操作符  有 gt() 、eq()、ne()、le()、lt()、ge()

# 比较函数 gt()、eq()、ne()、le()、lt()、ge()
cwur['score'].gt(85)

1.7  分组、应用和聚合

首先将数据按照不同的key进行分割(Split),然后将求和函数sum()应用(Apply)于各组,最后再将数据合并(Combine)到一起,得到最终结果

import pandas as pd
import seaborn as sns

#以Seaborn中自带的tips数据集为例对GroupBy进行讲解
df_tips = sns.load_dataset('tips')
df_tips

groupby() 函数创建一个DataFrameGroupBy对象,DataFrameGroupBy对象,是完成了图的Split工作,

df_tips.groupby(by='sex')


# 多列分组
df_tips.groupby(by=['sex','day'])

size() 是DataFrameGroupBy对象提供的一个分组聚合函数,该函数将自动统计Male组和Female组中的数据大小分组里面男性(Male)和女性(Female)各有多少

df_tips.groupby(by='sex').size()

get_group() 函数来获取指定组

groups=df_tips.groupby(by='sex')

# 对分组对象进行遍历
for group in groups:
    print(group)

# 获取指定组
groups.get_group('Female').head(3)

对分组中每列都进行聚合运算

df_tips.groupby(by='sex')['total_bill'].mean()

#提供了如下的聚合函数。  
# sum():求和  
# mean():求平均值 
# count():统计所有非空值  
# size():统计所有值  
# max():求最大值  
# min():求最小值  
# std():计算标准差

#count()函数不会统计空值,而size()函数只是统计组的大小,不管取值是否为空。


# 也可以使用agg()或aggregate()函数来进行分组统计
grouped=df_tips.groupby(by='sex')['total_bill'].agg('mean')

# 可以完成多种求值
grouped=df_tips.groupby(by='sex')['total_bill'].agg(['mean','min','max'])

# 可以对聚合后的列进行重命名
grouped=df_tips.groupby(by='sex')['total_bill'].agg([('tip_mean','mean'),('tip_min','min')])

# 不同列的进行不同的聚合运算
df_tips.groupby(by='sex').agg({'tip':[('avg_mean','mean'),('max_tip','max')],'total_bill':[('avg_bill',"mean")]})

# 自定义分组函数
grouped=df_tips.groupby(by='sex').agg({'total_bill': lambda bill:bill.max()-bill.min()})
# 不同的列定义不同的函数
grouped=df_tips.groupby(by='sex').agg({'total_bill': lambda bill:bill.max()-bill.min(),'tip':lambda tip:tip.max()})


grouped=df_tips.groupby(by='sex')['total_bill'].aggregate('mean')


# 自定义新函数
def max_deviation(s):
    std_score = (s-s.mean())/s.std()
    return std_score.abs().max()

df_tips.groupby('sex')['tip'].agg(max_deviation)


# 完成聚合后,想将Index去掉,那么可以直接使用reset_index()函数
grouped.reset_index()

数据过滤与交换

filter()和transform()函数  进行过滤和变换

# filter 对数据进行过滤
df_tips.groupby('day').filter(lambda x:x['total_bill'].mean()>20)

# tarnsform 对数据进行交换
df_tips['day_average'] = df_tips.groupby('day')['total_bill'].tarnsform(lambda x:x.mea())

1.8 数据读入 

常用的数据读取函数有:

read_csv()  
to_csv()
    
read_excel()
to_excel()

read_hdf()
to_hdf()

read_sql()
to_sql()

read_json() 
to_json()

read_html() 
to_html

read_stata()
to_stata()

read_sas() 
to_sas()

read_clipboard()
to_clipboard()

read_pickle()
to_pickle()

read_csv()读取数据

path = "../data/Online_Retail_Fake.csv"
# 读取文件 必要参数path给出文件路径,encoding 设置CSV文件编码格式,默认为 utf-8
 df = pd.read_csv(path,encoding='gbk')

# 指定用Team来作为index的列
df = pd.read_csv(path,index_col='Team')


# sep 给出文件分隔符,默认为‘,’ 
 df = pd.read_csv(path,encoding='gbk',sep=',')

#  设置文件标题 header默认为0,表示0行为标题,可以定None表示文件无标题,header为none,可以给定#   names来给定列名
 df = pd.read_csv(path,encoding='gbk',sep=',',header=None)
 df = pd.read_csv(path,header=None,names=list('abcdef'))

#  支持预先指定列的数据类型
 df = pd.read_csv(path,header=None,names=list('abcdef'),dtype={'Goals':np.float64})

# 只需要读取部分列的数据,此时可以通过usecols参数来进行设置
 df = pd.read_csv(path,index_col=0,usecols=['Team','Goals','Shots on target'])

# nrows 从文件开始时选取需要读取的行数
 df = pd.read_csv(path,encoding='gbk',sep=',',nrows=5)

# skiprows 可以忽略前面行数 
 df = pd.read_csv(path,encoding='gbk',sep=',',skiprows=5)

# skipfooter 可以忽略 最后行数
df = pd.read_csv(path,encoding='gbk',sep=',',skipfooter=5)

# na_values 一组可以用来替换NA值,数组中的值为NA
 df = pd.read_csv(path,encoding='gbk',sep=',',skiprows=5,na_values=[0])


read_excel()读取数据

path = "../data/Eueo2012_excel.xlsx"
# 读取文件 通过参数sheet_name可以指定读入哪一个表
eu12 = pd.read_excel(path,sheet_name='Eueo2011')

1.9 数据合并 

pandas.merge()函数 将不同结构的数据框,按照一定条件进行合并

# pandas.merge()参数
# left: 参与合并左侧的DateFrame
# right: 参与合并的右侧DataFrame
# how: 'inner' 'outer' 'left' 'right' 默认为inner
# on: 用于连接的列名 必须存在于两个DataFrame中
# left_on: 左侧DataFrame中用作连接的列
# right_on:   右侧DataFrame中用作连接的列
# left_index: 将左侧的行索引用作其连接链
# right_index: 将右侧的行索引用作其连接链
# sort 根据连接链合并进行排序,大数据量是可禁用
# suffixes: 字符串值元祖,用于追加到重叠列名的末尾 默认为_x _y
# copy 设置为FALSE,可以在某些情况下避免将数据复制到结果数据结构中,默认总是复制

# 创建两个DataFrame
df1 = pd.DataFrame({'key':list("bbaca","data1":range(5)})
df2 = pd.DataFrame({'key':list("abc","data1":range(3)})

# inner内连接, 并安装相同字段合并
pd.merge(df1,df2,on='key')


# 当两边合并字段不同是,可以使用left_on 和right_on 参数设置合并字段,left_on 和right_on值都是可以
pd.merge(df1,df2,left_on='key',right_on='key')


# 设置外联方式 ,取并集, 是左右连接的并集
pd.merge(df1,df2,how='outer')

# 设置左联方式 ,左连接是左侧DataFrame取全部数据,右侧DataFrame匹配左侧的DataFrame
pd.merge(df1,df2,how='left')


 Pandas.join() 提供了函数来合并DataFrame的列

# 采用左连接方式基于索引进行合并,左边数据集的列会加上后缀_left,右边的加上后缀_right
left.join(right,lsuffix='_left',rsuffix='_right')

# 实现了外连接
left.join(right,how='outer',lsuffix='_left',rsuffix='_right')


# 实现了内连接
left.join(right,how='inner',lsuffix='_left',rsuffix='_right')

concat() 将数据根据不同的轴作简单的融合

# objs: series,dataFrame 或者panel 构成的序列lsit
# axis 需要合并链接的轴 0是行,1是列
# join 连接方式inner 或者 outer
df.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, 
names=None, verify_integrity=False)

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Pandas是一个Python库,用于数据处理和分析。在数据分析中,预处理是非常重要的一步,因为它可以帮助我们清洗和转换数据,使其更适合进行分析。Pandas提供了一些强大的预处理功能,包括数据清洗、数据转换、数据重塑和数据合并等。在使用Pandas进行数据分析时,预处理是必不可少的一步。 ### 回答2: 在数据分析中,数据的预处理是一个必要的过程。它的主要目的是清洗数据,准备数据,以便后续分析。在Python中,pandas是一种广泛使用数据处理库。pandas可以通过其高效的数据结构和操作方法来清洗和处理数据。在本文中,将介绍pandas预处理的一些常见技术。 一、读取数据pandas中,使用read_csv()函数读取CSV格式的数据文件,read_excel()函数读取Excel格式的数据文件。它们都有很多选项,可以根据具体文件的格式进行设置。 二、查看数据pandas中,使用以下函数查看数据: 1. head() - 显示数据框的前几行; 2. tail() - 显示数据框的后几行; 3. columns - 显示数据框的列名; 4. shape - 显示数据框的行列数; 5. info() - 显示数据框的基本信息,包括每列的名称、非空值数量和数据类型。 三、数据清洗 在数据清洗中,有以下一些常见的技术: 1. 删除重复行:使用drop_duplicates()函数; 2. 替换空值:使用fillna()函数; 3. 删除空值:使用dropna()函数; 4. 更改数据类型:使用astype()函数。 四、数据准备 在数据准备中,有以下一些常见的技术: 1. 数据合并:使用merge()函数; 2. 数据筛选:使用loc()函数或者iloc()函数; 3. 数据分组:使用groupby()函数; 4. 数据排序:使用sort_values()函数。 五、数据分析数据分析中,有以下一些常见的技术: 1. 数据聚合:使用agg()函数; 2. 统计描述:使用describe()函数; 3. 数据可视化:使用matplotlib或者seaborn库。 综上所述,pandas预处理是数据分析中必不可少的一步。通过使用pandas提供的函数和方法,可以方便地清理和处理数据,使其更容易被分析。 ### 回答3: PandasPython中最强大的数据处理库之一,它提供了DataFrame和Series这两种数据结构,可以快速便捷地处理数据。在数据分析过程中,我们往往需要先对数据进行预处理,以便后续的分析。Pandas提供了一系列的方法和函数,可以帮助我们进行数据的预处理。 首先,在进行数据分析之前,我们需要了解自己所面对的数据类型和数据结构。Pandas中的DataFrame结构就是类似于表格的结构,每一行代表一个样本,每一列代表一个属性。Series则是一维的数组结构。通过pandas.read_csv(),我们可以读取CSV格式的数据,并转化为DataFrame结构。 接下来,我们要对数据进行一些基本的处理,例如数据清洗、数据去重、缺失值处理、异常值处理等。在数据清洗过程中,我们往往需要对数据进行一些特殊的处理,例如字符串的分割、合并、替换等操作,Pandas提供了一系列能够对文本进行操作的函数。在数据去重方面,我们可以使用drop_duplicates()函数,它可以去除DataFrame中的重复记录。在处理缺失值时,Pandas提供了一系列的函数,如fillna()函数、dropna()函数,可以方便地将NaN值变为其他有意义的值,或者删除缺失值的行或列。在异常值处理方面,我们可以使用isoutlier()函数来找到数据中的异常值,并进行处理。 在数据预处理完成后,我们可以对数据进行一些统计分析,例如计算小计、计算总计、分位数、极差、方差、标准差等统计指标。我们可以使用describe()函数来获得数据的统计描述,还可以使用groupby()函数来对数据分组,使用agg()函数对每组进行计算统计指标。此外,我们还可以对数据进行排序、丢弃、合并等操作。 总之,Pandas是一个非常强大的Python库,可以轻松处理数据预处理和数据处理方面的任务。Pandas作为数据分析数据处理的基础库,使用熟练后可以在数据分析中发挥更大的作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马蹄疾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值