pandas基础用法详解

pandas基础用法详解

本文旨在总结pandas的基础用法,越用越发感觉基础的重要性,复杂和高级只是基础的衍生, 扎实的基础和深刻的理解能帮助我们更快的弄懂复杂的东西, 基础的熟悉的也就就能轻松发挥了。

pandas是什么

Pandas 是一个强大的分析结构化数据的工具, 它以Numpy为基础, 添加了numpy数组没有的标签, 非常适用于数据清晰、挖掘、分析。

生成

pandas数组有两种类型:

  1. 一维数组,带有标签的,称为Series(序列)
  2. 二维数组,带有标签的,成为DataFrame (数据框)
    这很好理解, 多个Series组合就是DataFrame, DataFrame也是用的最多的pandas结构, 它让数据分析是那么的舒服自然。可以分别通过一维和二维的 列表, 字典,numpy数组转化生成 ,比如
x = pd.Series([0,1,2], index=list("abc")) # 列表 # pd.Series 主要是多了一个标签 
>>>a    0
   b    1
   c    2
   dtype: int64
x = pd.Series(np.arange(3), index =list("abc"),  name="np生成的pseries") #  numpy数组
>>>a    0
   b    1
   c    2
   Name: np生成的pseries, dtype: int32
x = pd.Series({"a":1, "b":2, "c":3}, name="字典生成的series") # 字典 , 字典的键就是标签index
>>>a    1
   b    2
   c    3
   Name: 字典生成的series, dtype: int64
data = pd.DataFrame([[1,2],[3,4]], columns=['a', 'b']) # 二维列表生成数据框 # 行和列都可以设标签, 行为index ,列称作colmus
>>>   a  b
   0  1  2
   1  3  4
data = pd.DataFrame(np.arange(4).reshape(2,2), index='a', 'b') # 二维numpy数组生成数据框
>>>   0  1
   a  0  1
   b  2  3
data_top5 = pd.DataFrame({"姓名" : ['黄药师' , '欧阳锋', '段智兴', '洪七公','周伯通'],
                     '帮派': ['桃花岛', '白驼山', 'np.nan', '丐帮', '全真教'],
                     '年纪':[50, 58 ,68, 68, 39],
                     '武功': ['碧海潮声曲', '蛤蟆功', '一阳指', '降龙十八掌', '空明拳'],
                     '战斗力': [23435, 22984, 24103, 22873, 22385]},
                    index=['东邪', '西毒', '南帝', '北丐', '中神通'])   # 字典生成数据框,键作为columns 
>>>      姓名      帮派  年纪     武功    战斗力
   东邪   黄药师     桃花岛  50  碧海潮声曲  23435
   西毒   欧阳锋     白驼山  58    蛤蟆功    22984
   南帝   段智兴     np.nan  68    一阳指   24103
   北丐   洪七公      丐帮   68  降龙十八掌  22873
  中神通  周伯通     全真教  39    空明拳    22385

数据的查看与统计信息

>>> data_top5.info()   # 查看数据框总体信息  包含类型 ,行标签, 列标签, 各列格式,是否有空值,内存
<class 'pandas.core.frame.DataFrame'>  
Index: 5 entries, 东邪 to 中神通
Data columns (total 5 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   姓名      5 non-null      object
 1   帮派      4 non-null      object
 2   年纪      5 non-null      int64 
 3   武功      5 non-null      object
 4   战斗力     5 non-null      int64 
dtypes: int64(2), object(3)
memory usage: 240.0+ bytes

>>> data_top5.dtypes # 返回各列数据类型 , 类属性,不加括号 ,加括号的为类方法。
姓名     object
帮派     object
年纪      int64
武功     object
战斗力     int64
dtype: object

>>> data_top5.shape  # 返回一个元组 
(5, 5)

>>> data_top5.columns # 返回列标签
Index(['姓名', '帮派', '年纪', '武功', '战斗力'], dtype='object')

>>>data_top5.index  # 返回行标签
Index(['东邪', '西毒', '南帝', '北丐', '中神通'], dtype='object')

>>> data_top5.values  # 返回一个二维numpy数组,数据框的值, 去除标签
array([['黄药师', '桃花岛', 50, '碧海潮声曲', 23435],
       ['欧阳锋', '白驼山', 58, '蛤蟆功', 22984],
       ['段智兴', nan, 68, '一阳指', 24103],
       ['洪七公', '丐帮', 68, '降龙十八掌', 22873],
       ['周伯通', '全真教', 39, '空明拳', 22385]], dtype=object)
       
>>> data_top5.head(2) # 查看前两行 ,默认5行
     姓名   帮派  年纪     武功    战斗力
东邪  黄药师  桃花岛  50  碧海潮声曲  23435
西毒  欧阳锋  白驼山  58    蛤蟆功  22984

>>> data_top5.tail(2) # 查看后两行 ,默认5行
      姓名   帮派  年纪     武功    战斗力
北丐   洪七公   丐帮  68  降龙十八掌  22873
中神通  周伯通  全真教  39    空明拳  22385

>>>data_top5.describe() # 返回列中数值型数据的基本统计信息
              年纪           战斗力
count   5.000000      5.000000
mean   56.600000  23156.000000
std    12.401613    647.835627
min    39.000000  22385.000000
25%    50.000000  22873.000000
50%    58.000000  22984.000000
75%    68.000000  23435.000000
max    68.000000  24103.000000

>>> data_top5.mean()  # 返回列中数值型数据的均值
年纪        56.6
战斗力    23156.0

>>> data_top5['年纪'].sum() # 不能只返回数值型数据, 指定具体的列, 返回求和
年纪           283

>>> data_top5.var() # 返回列中数值型数据的均值
年纪        153.8
战斗力    419691.0

>>> data_top5['年纪'].min() # 返回指定列的最小值    
 39
 
>>> data_top5['帮派'].value_counts() #  # 返回指定列的直方统计   
白驼山    1
丐帮     1
全真教    1
桃花岛    1

>>> data_top5.isnull() # 返回一个值为T/F 同样大小的数据框 , 查看该位置是否为空
        姓名     帮派     年纪     武功    战斗力
东邪   False  False  False  False  False
西毒   False  False  False  False  False
南帝   False   True  False  False  False
北丐   False  False  False  False  False
中神通  False  False  False  False  False

>>> data_top5['武功'].unique()   # 返回指定列的唯一值, 也就是所有类别 
array(['碧海潮声曲', '蛤蟆功', '一阳指', '降龙十八掌', '空明拳'], dtype=object)
>>> data_top5['年纪'].hist()   #直接画出数值型数据的直方图,很方便

数据清洗方法

# 对标签不满意 ?可以重新设置 
>>>data_top5.reindex(columns=['姓名', '帮派', '战斗力', '年纪', '武功']) # 将列重新排序 
      帮派   姓名    战斗力  年纪     武功
东邪   桃花岛  黄药师  23435  50  碧海潮声曲
西毒   白驼山  欧阳锋  22984  58    蛤蟆功
南帝   NaN  段智兴  24103  68    一阳指
北丐    丐帮  洪七公  22873  68  降龙十八掌
中神通  全真教  周伯通  22385  39    空明拳

>>>data_top5.index = ['a', 'b', 'c', 'd', 'e'] # 重新命名行标签
>>>data_top5.columns = ['a', 'b', 'c', 'd', 'e'] # 重新命名列标签
     a    b   c      d      e
a  黄药师  桃花岛  50  碧海潮声曲  23435
b  欧阳锋  白驼山  58    蛤蟆功  22984
c  段智兴  NaN    68    一阳指  24103
d  洪七公   丐帮  68  降龙十八掌  22873
e  周伯通  全真教  39    空明拳  22385

>>>data_top5.set_index('a')  # 将某一列设为行标签 
       b   c      d      e
a                         
黄药师  桃花岛  50  碧海潮声曲  23435
欧阳锋  白驼山  58    蛤蟆功  22984
段智兴  NaN  68    一阳指  24103
洪七公   丐帮  68  降龙十八掌  22873
周伯通  全真教  39    空明拳  22385
#  后悔了可以用 data_top5.reset_index()  复原

# 对重复值的处理 
>>>data_top5.duplicated() # 查看完全重复的行
>>>data_top5.drop_duplicates() # 删除多余完全重复的行 
>>>data_top5['姓名'].is_unique  #  查看某一列是否有重复

# 对缺失值的处理 
>>>data_top5.isnull().sum()  # 查看缺失值
>>>data_top5.fillna(x) #  用x替换空值
>>>data_top5.dropna(axis=0, how='any', inplace=False) # 也可以直接删除缺失值  参数axis可取0,1 ,默认为0,表示行 
                                                   # how={‘any’, ‘all’}, 默认‘any’指删除含有缺失值的行;'all’指删除全是缺失值的行
                                                   # inplace=True 表示直接在原数据上更改
>>>data_top5.drop('b', inplace=True, axis=1) # 可以原地操作, 删除不需要的行或列  
                                                 

读取以及保存数据

读取数据是数据分析必备的操作,保存可以使得结果可以复用, pandas读取与保存数据的语法非常清晰,read_文件格式() 以及 to_文件格式() 。pandas可以存取很多格式的文件, 常用的有csv, excel, sql, hdf5, json, 方法如下

读取方法

函数 操作
read_csv() 读取csv文件
read_excel() 读取excel文件
read_sql() 读取sql文件
read_hdf() 读取hdf5文件
read_json() 读取json文件
to_csv() 写入csv文件
to_excel() 写入excel文件
to_sql() 写入sql文件
to_hdf() 写入hdf5文件
to_json() 写入json文件

read_csv 常用参数详解

这里列出常用的read_csv所有参数表,其他的读取函数用法参见https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html

参数 说明 格式 默认
filepath_or_buffer 读取文件的路径 str None
sep 指定分隔符 str ’ , ’
delimiter 定界符,备选分隔符(如果指定该参数,则sep参数失效) str None
header 用作列索引的行 int 0
names 用于结果的列名列表,如果数据文件中没有列标题行,就需要执行header=None array-like None
index_col 用作行索引的列编号或者列名,如果给定一个序列则有多个行索引 int, str, sequence of int / str, or False None
usecols 读取的列,usecols有效参数可能是 [0,1,2]或者是 [‘年龄’, ‘身高’, ‘体重’]。使用这个参数可以加快加载速度并降低内存消耗。 list-like None
squeeze 如果文件值包含一列,则返回一个Series bool False
prefix 没有标题时设定列名,‘X’ 就是X0, X1, … str None
mangle_dupe_cols 重复的列是否添加后缀,重复的列,将‘X’…’X’表示为‘X.0’…’X.N’ bool True
dtype 每列数据的数据类型。例如 {'姓名‘:str,年龄’: np.int32, ‘身高’: np.float32} Type None
engine 要使用的解析器引擎 {‘c’, ‘python’} ‘python’
skipinitialspace 是否跳过分隔符后面的空格 bool False
converters 列转换函数的字典。key可以是列名或者列的序号。 dict None
skiprows 从文件开始处算起要忽略的行数,或需要跳过的行号列表 int, list-like None
skipfooter 文件底部要跳过的行数 dict None
nrows 要读取的文件行数。对读取大文件很有用 int None
na_values 一组用于替换NA/NaN的值。如果传参,需要制定特定列的空值。默认为‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘nan’` scalar, str, list-like, or dict None
keep_default_na 如果指定na_values参数,并且keep_default_na=False,那么默认的NaN将被覆盖,否则添加 bool None
na_filter 是否标记NA.对于大文件来说数据已知没有空值,设定na_filter=False可以提升读取速度。 bool True
verbose 是否打印各种解析器的输出信息,例如:“非数值列中缺失值的数量”等 bool False
skip_blank_lines 如果为True,则跳过空行;否则记为NaN。 bool True
parse_dates 解析日期 ,详见1 bool or list of int or names or list of lists or dict False
infer_datetime_format 如果设定为True并且parse_dates 可用,那么pandas将尝试转换为日期类型,如果可以转换,转换方法并解析。在某些情况下会快5~10倍。 bool False
keep_date_col 如果连接多列解析日期,则保持参与连接的列。 bool False
date_parser 用于解析日期的函数 function ateutil.parser.parser
dayfirst DD/MM格式的日期类型 bool False
cache_dates 如果为真,则使用唯一已转换日期的缓存来应用日期时间转换。可能在解析重复的日期字符串时产生显著的加速,特别是那些具有时区偏移量的日期字符串 bool True
iterator 返回一个 TextFileReader 对象,以便逐块处理文件。 bool False
chunksize 文件块的大小 int None
compression 直接打开压缩文件。如果使用infer参数,则使用 gzip, bz2, zip或者解压文件名中以‘.gz’, ‘.bz2’, ‘.zip’, or ‘xz’这些为后缀的文件,否则不解压。如果使用zip,那么ZIP包中国必须只包含一个文件。设置为None则不解压。 {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None} ‘infer’
thousands 千分位分割符,如“,”或者“." str None
decimal 字符中的小数点 str ‘.’
lineterminator 行分割符,只在C解析器下使用。 str (length 1) None
quotechar 引号,用作标识开始和解释的字符,引号内的分割符将被忽略。 str (length 1) None
quoting 控制csv中的引号常量 int or csv.QUOTE_* instance 0
doublequote 双引号,当单引号已经被定义,并且quoting 参数不是QUOTE_NONE的时候,使用双引号表示引号内的元素作为一个元素使用。 bool True
escapechar 当quoting 为QUOTE_NONE时,指定一个字符使的不受分隔符限值。 str None
encoding 指定解码字符集类型 str ‘utf-8’
dialect 如果没有指定特定的语言,如果sep大于一个字符则忽略 str or csv.Dialect instance None
error_bad_lines 如果一行包含太多的列,那么默认不会返回DataFrame ,如果设置成false,那么会将改行剔除(只能在C解析器下使用) bool True
warn_bad_lines 如果error_bad_lines =False,并且warn_bad_lines =True 那么所有的“bad lines”将会被输出(只能在C解析器下使用) bool True
delim_whitespace 指定空格(例如’ ‘或者’ ‘)是否作为分隔符使用 bool
low_memory 指定C引擎应该为浮点值使用哪个转换器。普通转换器为None,高精度转换器为high,往返转换器为round_trip。 str None
memory_map 如果使用的文件在内存内,那么直接map文件使用。使用这种方式可以避免文件再次进行IO操作。 bool False

查询

pandas 1.0版本之后,查询方法删除了pd.ix[ ](删的好呀)。 主要用到的有查询以下三类:(为了描述清楚这三种方法 ,这里做几个词语含义规定,以上述数据框为例,将行和列的附加信息称为 标签, 行的附加信息为行标签,如 “东邪”, “西毒” 。列的附加信息称为列标签 ,如“姓名”, “武功” 。将行与列的位置称为下标,下标从0开始。显然标签是字符串, 下标是整型 。将类似于列表的切片方法[start:end:step] 称为切片 。切片功能很强大, 但切片只能有规律的查询, 不能任意指定位置,比如现在需要 第1,2,5列 ,还需要一种位置的列表 [1, 2, 5] 查询 的方法, 称为索引 。)

  1. df[ ] , 不调用类方法,直接查询。只可以对行的下标做切片 ,以及对列标签做索引 。至于为什么这样设计 ,我真的没搞清楚 ,知道的麻烦告诉我 。
  2. df.loc[ ] 与df.iloc[ ] ,这个 i 指integer ,带i的就是只能用下标查询 。而不带i的只能用标签查询 ,查询可以是切片,也可以是索引,也可以混合使用 。返回数据框 。
  3. df.at[ ] ,df.iat[ ] ,at 与loc 的区别在于,at只能查询一个元素 ,返回值为该元素 。i 的区别类似 。
    下面代码展示:
### 用之前的数据框为栗子
>>>print(data_top5)
        姓名    帮派   年纪    武功    战斗力
东邪   黄药师  桃花岛  50  碧海潮声曲  23435
西毒   欧阳锋  白驼山  58    蛤蟆功    22984
南帝   段智兴   NaN    68    一阳指    24103
北丐   洪七公   丐帮   68  降龙十八掌  22873
中神通  周伯通  全真教  39    空明拳   22385

# 第一类两种方法 
>>>data_top5[1:3]  # 行的下标切片 
     姓名   帮派  年纪   武功    战斗力
西毒  欧阳锋  白驼山  58  蛤蟆功  22984
南帝  段智兴  NaN  68  一阳指  24103

>>>data_top5[ ['年纪','武功'] ] # 列 的标签索引  ,只索引一列可以省略[ ] , 如 data_top5['年纪']
     年纪     武功
东邪   50  碧海潮声曲
西毒   58    蛤蟆功
南帝   68    一阳指
北丐   68  降龙十八掌
中神通  39    空明拳

# 第二类两种方法
>>>data_top5.loc['东邪':"西毒", '姓名':'武功']  # loc只能用于标签 # 行列 切片 
     姓名   帮派  年纪     武功
东邪  黄药师  桃花岛  50  碧海潮声曲
西毒  欧阳锋  白驼山  58    蛤蟆功

>>>data_top5.loc[['东邪',"西毒"], ['姓名','武功']] # loc只能用于标签 # 行列 索引
     姓名     武功
东邪  黄药师  碧海潮声曲
西毒  欧阳锋    蛤蟆功

>>>data_top5.iloc[[2,3],[2,4]]  #  iloc只能用于下标 # 行列索引
    年纪    战斗力
南帝  68  24103
北丐  68  22873

>>>data_top5.iloc[0:2, [2,4]]   #  iloc只能用于下标 # 行切片, 列索引
    年纪    战斗力
东邪  50  23435
西毒  58  22984 

# 第三类两种方法
>>>data_top5.at['东邪', '姓名'] # at  只能选择一个元素,(可能是因为at :prep. 在,表示存在或出现的地点) 所以行和列都只能填一个 
'黄药师'

>>>x = data_top5.iat[1,2]      # iat 用于下标 ,也只能选择一个元素
>>>type(x)
numpy.int64

总结 : loc方法最灵活方便,并且可以完成完成其他两类的操作 。如果没有特殊需求,强烈建议使用loc而尽量少使用[],因为loc在对DataFrame进行重新赋值操作时会避免chained indexing问题,使用[ ]时编译器很可能会给出SettingWithCopy的警告。具体可以参见官方文档2

数据框的连接

数据框的连接主要是两个函数,pd.merge() 和pd.concat() 。
pd.merge( ) 的作用是连接左右两个数据库, 像门的两扇一样 ,不能上下连接 。既然是左右连接就相当于给同样的样本不同的特征信息连接, 就要确定像sql里表的主键 。merge的常用的参数有 pd.merge( left, right, how=‘inner’, on=None, left_on=None, right_on=None, left_index=False, right_index=False, suffixes=(’_x’, ‘_y’), indicator=False) 。
直接代码展示 :

pd.merge()

# 以上面的数据框为例  
# 我认为各个参数都是由我们的需求产生的, 先看简单的两个参数
# suffixes 就是当拼接时出现同样的列,该怎么办,merge可以标记来自哪个数据框,默认('_x', '_y')
# indicator 可以指示数据来自哪个数据框 ,可以是right, left, both
>>>pd1 = data_top5.iloc[:, [0, 1]]   >>> pd2 = data_top5.iloc[:, [0, 2]]  >>>data=pd.merge(pd1,pd2,on= '姓名',suffixes=('左', '右'), indicator= True) 
      姓名   帮派                             姓名   帮派  年纪                      姓名  帮派_左  帮派_右  年纪 _merge
东邪   黄药师  桃花岛                 东邪    黄药师  桃花岛  50                  0  黄药师  桃花岛  桃花岛  50   both
西毒   欧阳锋  白驼山                 西毒    欧阳锋  白驼山  58                  1  欧阳锋  白驼山  白驼山  58   both
南帝   段智兴  NaN                    南帝    段智兴    NaN  68                  2  段智兴   NaN    NaN     68   both
北丐   洪七公   丐帮                  北丐    洪七公   丐帮  68                   3  洪七公   丐帮   丐帮    68   both
中神通  周伯通  全真教                中神通  周伯通  全真教  39                  4  周伯通  全真教  全真教  39   both
# 关于主键的选择  
# 1如果两个数据框想指定不同的主键 ,比如同样的信息但列标签不同,就可以用 left_on , righr_on 分别指定

>>>pd1.columns  = [ '英雄名单', '帮派']
>>>pd1                          >>>pd2                            >>>data = pd.merge(pd1, pd2, left_on='英雄名单', right_on='姓名')           
     英雄名单   帮派                   姓名   帮派  年纪                 英雄名单 帮派_x   姓名 帮派_y  年纪
东邪   黄药师  桃花岛           东邪   黄药师  桃花岛  50             0  黄药师  桃花岛  黄药师  桃花岛  50
西毒   欧阳锋  白驼山           西毒   欧阳锋  白驼山  58              1  欧阳锋  白驼山  欧阳锋  白驼山  58
南帝   段智兴  NaN              南帝   段智兴  NaN  68                2  段智兴  NaN  段智兴  NaN  68
北丐   洪七公   丐帮            北丐   洪七公   丐帮  68              3  洪七公   丐帮  洪七公   丐帮  68
中神通  周伯通  全真教          中神通  周伯通  全真教  39            4  周伯通  全真教  周伯通  全真教  39

# 2如果想使用行标签作为主键 ,使用 left_index ,right_index
>>>ata = pd.merge(pd1, pd2, left_index=True, right_index=True )
    英雄名单 帮派_x   姓名 帮派_y  年纪
东邪   黄药师  桃花岛  黄药师  桃花岛  50
西毒   欧阳锋  白驼山  欧阳锋  白驼山  58
南帝   段智兴  NaN  段智兴  NaN  68
北丐   洪七公   丐帮  洪七公   丐帮  68
中神通  周伯通  全真教  周伯通  全真教  39
    
# 最后, 主键定了之后,两个数据框的主键不同 ,怎么办?按照谁的为标准
# merge 提供选择,left选择左边的, right右边的,inner交集,outer并集 ,缺少的用NaN 填充 
>>>pd1 = data_top5.iloc[0:3, [0, 1]]
>>>pd2 = data_top5.iloc[2:5, [0, 2]]
>>>data = pd.merge(pd1, pd2, on='姓名', how='inner' )
    姓名   帮派  年纪
 0  段智兴  NaN  68
 
>>>data = pd.merge(pd1, pd2, on='姓名', how='left' )
    姓名   帮派    年纪
0  黄药师  桃花岛   NaN
1  欧阳锋  白驼山   NaN
2  段智兴  NaN  68.0

>>>data = pd.merge(pd1, pd2, on='姓名', how='right' )
    姓名   帮派  年纪
0  段智兴  NaN  68
1  洪七公  NaN  68
2  周伯通  NaN  39

>>>data = pd.merge(pd1, pd2, on='姓名', how='outer' )
    姓名   帮派    年纪
0  黄药师  桃花岛   NaN
1  欧阳锋  白驼山   NaN
2  段智兴  NaN  68.0
3  洪七公  NaN  68.0
4  周伯通  NaN  39.0      

pd.concat()

如果需要上下拼接或者多个数据框拼接就必须使用pd.concat() 。参数如下

参数 说明 格式 默认
objs 参与连接的数据框 list / dict None
axis 连接的轴 {0,1,…} 0
join 如何处理其他轴上的索引 outer为并集 inner为交集 outer
ignore_index 是否删除连接轴的索引,然后新建索引 bool False
keys 使用传递的参数作为层次化索引 sequence None
names 结果层次索引中的级别的名称 list None
verify_integrity 检查新的连接的轴是否包含重复项 bool False
sort 如果连接是“外部的”,则对未对齐的非连接轴进行排序。 当join='inner’时,这不起作用,因为它已经保留了非连接轴的顺序 bool False

下面代码演示 :

# abjs指定要连接的数据框, axis指定连接的方向,默认为0指上下连接 ,设定为1为左右连接
# join 指定非连接轴的选取方式 
>>>pd.concat([pd1, pd2], join='outer')                           >>>pd.concat([pd1, pd2], join='inner')
      姓名   帮派    年纪                                           姓名
东邪   黄药师  桃花岛   NaN                                  东邪   黄药师 
西毒   欧阳锋  白驼山   NaN                                  西毒   欧阳锋
南帝   段智兴  NaN   NaN                                     南帝   段智兴
南帝   段智兴  NaN  68.0                                     南帝   段智兴
北丐   洪七公  NaN  68.0                                     北丐   洪七公
中神通  周伯通  NaN  39.0                                    中神通  周伯通

#   ignore_index  是否重新设定连接轴的索引 
>>>pd.concat([pd1, pd2], ignore_index= True)
    姓名   帮派    年纪
0  黄药师  桃花岛   NaN
1  欧阳锋  白驼山   NaN
2  段智兴  NaN   NaN
3  段智兴  NaN  68.0
4  洪七公  NaN  68.0
5  周伯通  NaN  39.0

# keys 设定多层索引
>>>pd.concat([pd1, pd2], keys=(1,2))
        姓名   帮派    年纪
1 东邪   黄药师  桃花岛   NaN
  西毒   欧阳锋  白驼山   NaN
  南帝   段智兴  NaN   NaN
2 南帝   段智兴  NaN  68.0
  北丐   洪七公  NaN  68.0
  中神通  周伯通  NaN  39.0
  
#  names 设定多层索引的每一层的 名字
>>>pd.concat([pd1, pd2], keys=(1,2), names=['表', '花名'])
        姓名   帮派    年纪
表 花名                 
1 东邪   黄药师  桃花岛   NaN
  西毒   欧阳锋  白驼山   NaN
  南帝   段智兴  NaN   NaN
2 南帝   段智兴  NaN  68.0
  北丐   洪七公  NaN  68.0
  中神通  周伯通  NaN  39.0
  
>>>pd.concat([pd1, pd2], verify_integrity=True) #  检查是否有重复项 ,默认为False 
ValueError: Indexes have overlapping values: Index(['南帝'], dtype='object') # 有重复则报错
# levels 我没有搞明白,清楚的麻烦告诉我

  1. read_csv更详细用法解释查询 https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-read-csv-table ↩︎

  2. http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy ↩︎

猜你喜欢

转载自blog.csdn.net/weixin_43705953/article/details/106958862