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

查询

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 / dictNone
axis连接的轴{0,1,…}0
join如何处理其他轴上的索引outer为并集 inner为交集outer
ignore_index是否删除连接轴的索引,然后新建索引boolFalse
keys使用传递的参数作为层次化索引sequenceNone
names结果层次索引中的级别的名称listNone
verify_integrity检查新的连接的轴是否包含重复项boolFalse
sort如果连接是“外部的”,则对未对齐的非连接轴进行排序。 当join='inner’时,这不起作用,因为它已经保留了非连接轴的顺序boolFalse

下面代码演示 :

# 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 ↩︎

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值