zoukankan      html  css  js  c++  java
  • pandas

    pandas

    数据结构

    pandas的基础数据结构,包括各类对象的数据类型,索引,轴标记,对齐等基本操作

    数据对齐是内在的,这一原则是根本,除非显式指定,pandas不会断开标签和数据之间的连接

    1.Series

    Series是一个带标签的一维数组,可存储整数,浮点数,字符串,python对象等类型的数据,轴标签统称为索引,调用pd.Series函数即可创建Series

    创建Series对象

    # Series参数
    data=None, index=None, dtype=None, name=None, copy=False, fastpath=False
    
    方法一:使用数组形式创建
    s = pd.Series(data,index=index)
    # demon  s = pd.Series([1,2,3,4,5],index=['a','b','c','d','e'])
    
    # data支持的数据类型
    python字典
    多维数组
    标量值(如,5)  只有一个值,这一行的值都是这一个
    
    方法二:使用字典形式创建
    s = pd.Series({'a':1,'b':2,'c':3})
    # data为字典且未设置index参数时,python版本>=3.6,Series按字典的插入顺序排序索引
    a    1
    c    2
    b    3
    
    s = pd.Series({'a':1,'c':2,'b':3},index=['a','b','c','d','e'])
    # 如果设置了index参数,则按索引标签提取data中对应的值,如果data中有,索引中没有,将不传递显示
    a    1.0
    b    3.0
    c    2.0
    d    NaN
    e    NaN
    
    # pandas用NaN表示缺失数据
    
    方法三:当data为标量值时
    s = pd.Series(5,index=['a','b','c','d','e'])
    # 当data为标量值时,必须提供索引,Series按索引长度重复该标量值
    a    5
    b    5
    c    5
    d    5
    e    5
    

    基本操作

    切片
    s[0:1]   # 对值进行切片,前开后闭
    a    1.0
    b    3.0
    
    s = pd.Series({'a':1,'c':2,'b':3},index=['a','b','c','d','e'])
    s[[4,3,1]]   # 取索引为4,3,1的值
    e    NaN
    d    NaN
    b    3.0
    
    array操作
    s = pd.Series({'a':1,'c':2,'b':3},index=['a','b','c','d','e'])
    s.array
    # 执行不用索引的操作时,如禁用自动对齐,访问数组非常有用,Series.array一般使扩展数组,
    <PandasArray>
    [1.0, 3.0, 2.0, nan, nan]    # 如果值中有nan,也会显示,可以使用 dropna 函数清除
    Length: 5, dtype: float64
            
    s = pd.Series({'a':1,'c':2,'b':3})
    s.to_numpy()
    # 提取真正的多维数组,要用Series.to_numpy()
    array([1, 2], dtype=int64)
    
    # Series时扩展数组,Series.to_numpy()返回的时NumPy多维数组
    
    Series对象取值
    s['a']  或   s[0]
    Series类似于字典,可以用索引标签取值或设置值,如果引用Series里没有的标签回触发异常,使用get可以提取没有的标签,返回None或指定默认值
    
    矢量操作
    s + s
    s * 2
    # Series和多维数组的主要区别在于,Series之间的操作会自动基于标签对齐数据,因此不用顾及执行计算操作的Series是否有相同的标签,总之,让不同索引对象操作的默认结果生成索引并集,是为了避免信息丢失,就算确实了数据,索引标签依然包含计算的重要信息,当然也可所以用 dropna 函数清除含有确实值的标签
    
    名称属性

    Series支持 name 属性

    s = pd.Series(np.random.randn(5),name='something')
    Out[33]:
    0   -0.314390
    1   -0.305942
    2    0.440155
    3   -0.800408
    4    0.721798
    Name: something, dtype: float64
    # 如果没有指定name属性,查询的时候是没有name属性的
    s.name   # 查询name
    s.rename   # 重命名Series
    
    

    2.DataFrame

    创建DataFrame对象

    DataFrame是由多种类型的列构成的二维标签数据结构,类似于Excel,SQL表,或Series对象后成的字典,DataFrame是最常用的Pandas对象,与Series一样,DataFrame支持多种类型的输出数据:
    
    # DataFrame 支持的输入数据类型
    一维ndarry,列表,字典,Series字典
    二维numpy.ndarry
    结构多维数组或记录多维数据
    Series
    DataFrame
    
    除了数据,还可以有选择地传递 index 行标签和 columns 列标签参数,传递了索引或列,就可以确保生成的DataFrame里包含索引或列,Series字典加上指定索引时,会丢弃与传递的索引不匹配的所有数据,没有传递轴标签时,按常规依据输入数据进行构建。
    
    # 注意
    python>=3.6,且pandas>=0.23,数据是字典,且未指定 columns 参数时, DataFrame 的列按字典的插入顺序排序
    
    # DataFrame参数
    self, data=None, index=None, columns=None, dtype=None, copy=False
    
    
    用Series字典或字典生成DataFrame(用字典生成)
    df = pd.DataFrame({'one':pd.Series([1,2,3,4,5],index=['a','b','c','d','e']),'two':{'a':6,'c':8,'f':9}})
    
        one    two
    a    1     6.0
    b    2     NaN
    c    3     8.0
    d    4     NaN
    e    5     NaN
    f    Nan   9.0
    
    # 1.生成的索引是每一个Series索引的并集,先把套接字典转换成Series,如果没有指定列,DataFrame的列就是字典键的有序列表
    # 2.index 和columns 属性分别用于访问行,列标签,指定列与数据字典一起传递时,传递的列会覆盖掉字典的键
    # 3.如果有一列有指定的行索引,并且另一列与这一列的索引有相似的部分,呢会将这两列的索引进行合并,缺失的地方使用Nan替换掉
    
    
    用多维数组字典,列表字典生成DataFrame(用字典生成)
    df = pd.DataFrame({'one':[1,2,3,4,5],'two':[6,7,8,9,0]},index=['a','b','c','d','e'])
    
    
    用列表字典生成DataFrame(用字典生成)
    df = pd.DataFrame([{'a':1,'b':2,'c':3},{'b':5}],index=['first','second'])
    
    		 a       b    	 c
    first   1.0		 2		3.0
    second	NaN		 5		NaN
    
    
    用包含日期时间索引与标签的NumPy数组生成DataFrame(随机数生成)
    In [5]: dates = pd.date_range('20130101', periods=6)
    
    In [6]: dates
    Out[6]: 
    DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
                   '2013-01-05', '2013-01-06'],
                  dtype='datetime64[ns]', freq='D')
    
    In [7]: df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
    
    In [8]: df
    Out[8]: 
                       A         B         C         D
    2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
    2013-01-02  1.212112 -0.173215  0.119209 -1.044236
    2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
    2013-01-04  0.721555 -0.706771 -1.039575  0.271860
    2013-01-05 -0.424972  0.567020  0.276232 -1.087401
    2013-01-06 -0.673690  0.113648 -1.478427  0.524988
    
    
    用Series字典对象生成DataFrame(字典生成)
    In [9]: df2 = pd.DataFrame({'A': 1.,
       ...:                     'B': pd.Timestamp('20130102'),
       ...:                     'C': pd.Series(1, index=list(range(4)), dtype='float32'),
       ...:                     'D': np.array([3] * 4, dtype='int32'),
       ...:                     'E': pd.Categorical(["test", "train", "test", "train"]),
       ...:                     'F': 'foo'})
       ...: 
    
    In [10]: df2
    Out[10]: 
         A          B    C  D      E    F
    0  1.0 2013-01-02  1.0  3   test  foo
    1  1.0 2013-01-02  1.0  3  train  foo
    2  1.0 2013-01-02  1.0  3   test  foo
    3  1.0 2013-01-02  1.0  3  train  foo
    
    
    用Series创建DataFrame

    生成的DataFrame继承了输入的Series的索引,如果没有指定列名,默认列名是输入Series的名称

    df = pd.DataFrame( 
        [pd.Series({'a':1,'b':2},index=['a','c','d']),
         pd.Series({'a':1,'b':2,'d':4},index=['a','c','d'])])
    
    	 a		 c		 d
    0	1.0		NaN		NaN
    1	1.0		NaN		4.0
    
    

    DataFrame常用操作

    提取 添加 删除列
    # DataFrame就像带索引的Series字典,提取,设置,删除列的操作与字典类似
    df = pd.DataFrame([{'a':1,'b':2,'c':3},{'b':5}],index=['first','second'])
    *************************  提取  *************************
    df['b']   # 提取 b 列的内容
    first     2
    second    5
    Name: b, dtype: int64
            
    *************************  删除  *************************
    del df['a']   # 删除指定列
    		b		c
    first	2		3.0
    second	5		NaN
    
    df1 = df.pop('a')   # 获取指定的删除列
    first     1.0
    second    NaN
    Name: a, dtype: float64
            
    *************************  添加  *************************        
    df['three'] = [11,22]
    		a		b		c		three
    first	1.0		2		3.0		11
    second	NaN		5		NaN		22
    
    # 可以插入原生多维数组,但长度必须与DataFrame索引长度一致,默认在DataFrame为不插入列,insert 函数可以指定插入列的位置
    df.insert(1, 'bar', df['one'])   # 在第一行插入列名为 bar ,值为df['one']的数据
       one  bar   flag  foo  one_trunc
    a  1.0  1.0  False  bar        1.0
    b  2.0  2.0  False  bar        2.0
    c  3.0  3.0   True  bar        NaN
    d  NaN  NaN  False  bar        NaN
    
    
    用方法链分配新列
    DataFrame 提供了 assign() 方法,可以利用现有的列创建新列
    
    df = pd.DataFrame({'one':[1,2,3,4,5],'two':[6,7,8,9,0]},index=['a','b','c','d','e'])
    df1 = df.assign(three=df['one']*2)
    df1
    		one		two		three
    a		1		6		2
    b		2		7		4
    c		3		8		6
    d		4		9		8
    e		5		0		10
    
    # assign 返回的是数据副本,原DataFrame不变,可以使用assign执行一些数据操作之类数据进行返回
    # assign 函数的签名就是 **kwargs,键是新字段的列名,值为插入值
    # assign 在pythn3.6之后可以保存 **kwargs 顺序,**kwargs 后的表达式可以引用同一个assign 函数里之前创建的列
    
    
    索引/选择
    操作 句法 结果
    选择列 df[col] Series
    用标签选择行 df.loc[label] Series
    用整数位置选择行 df.iloc[loc] Series
    行切片 df[1:3] DataFrame
    用布尔向量选择行 df[bool_vec] DataFrame
    数据对齐和运算

    DataFrame对象可以自动对齐 **列与索引列(行标签) **的数据,生成的结果是列和行标签的并集

    转置

    T 属性可以转置 DataFrame ,相当于把行和列转换位置,但是所对应的值不变

    df.T
    
    
    控制台显示
    df.info()   # info() 函数可以查看DataFrame的信息摘要
    df.to_string()    # 以表格的形式返回DataFrame的字符串表示形式
    
    

    常用操作

    查看数据

    numpy和pandas的区别:Numpy数组只有一种数据里类型,DataFrame每列的数据类型各不相同
    
    df.head()    # 默认显示5行
    
    df.tail(3)   # 显示最后三行
    
    df.index     # 显示索引名
    
    df.columns   # 显示列名
    
    df.to_numpy()   
    # 返回一个array对象,DataFrame的列由多种数据类型组成时,该操作耗费系统资源比较大,df.to_numpy()的输出不包含行索引和列索引
    
    df.describe()    # 快速查看数据的统计摘要
    
    df.T     # 转置数据
    
    df.sort_index(axis=1,ascending=False)    # 转轴排序
    
    df.sort_values(by='B')    # 按值排序
    
    

    选择数据

    推荐使用优化过的Pandas数据访问方法  .at   .iat   .loc   .iloc
    
    # 按标签选
    df.A    # 获取单列,产生Series对象
    
    df['A']    # 获取单列,产生Series对象
    
    df[1:3]    # 用[]切片行
    
    df.loc[]   # 按标签取值,第一个参数是行,第二个参数是列
    
    In [30]: df.loc[dates[0], 'A']
    Out[30]: 0.46911229990718628
        
    # 按位置选 
    df.iloc[3]    # 第一个参数是第几行,第二个参数是低级列
    
    df.iloc[3:5, 0:2]   # 切片取值
    
    df.iloc[[1, 2, 4], [0, 2]]    # 用整数列表按位置切片,取出1,2,4行,0,2列
    
    df.iloc[1, 1]    # 显式提取值
    
    # 布尔索引
    df[df > 0]    # 会在全表中选出判断结果为True的值,不满足条件的使用NaN填充
    
    df2 = df.copy()    # 将df的值拷贝一份
    
    df[df['E'].isin(['test'])]    # 取 df 的 E 列中含有 test 值的行
    
    

    赋值

    # 用索引自动对齐新增列的数据
    s1 = pd.Series([1, 2, 3, 4, 5, 6], index=pd.date_range('20130102', periods=6))
    df['F'] = s1
    
    # 按标签赋值
    df.at[1,'B'] = 111    # 将第一行,B列的值改为111
    
    # 按位置赋值
    df.iat[0,1] = 222    # 将第0行,第1列的值改为222
    
    # 用where条件赋值
    df[df > 0] = 111    # 将df中值大于0的更改为111
    
    

    缺失值

    Pandas 主要用 np.nan 表示缺失数据,计算时,默认不包含空值,

    重建索引(reindex)可以更改,添加,删除指定轴的索引,并返回数据福本,即不更改原数据

    df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])
    
    

    删除所有缺失值的行

    df.dropna(how='any')    # 删除所有含缺失值的行
    
    

    填充缺失值

    df.fillna(value=5555)
    
    

    提取 nan 值的布尔掩码

    pd.isna(df1)    # 对所有值进行判断,如果是nan就为True,不是就为False
    
    

    方法解析

    pandas中fillna()方法,能够使用指定的方法填充NA/NaN值。
    
    # 函数形式
    fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
    
    # 参数说明
    value:用于填充的空值的值。
    
    method: {'backfill', 'bfill', 'pad', 'ffill', None}, default None。定义了填充空值的方法, pad / ffill表示用前面行/列的值,填充当前行/列的空值,  backfill / bfill表示用后面行/列的值,填充当前行/列的空值。
    # ffill axis=1 使用前边一列值填充,bfill,axis=1 使用后一列值填充
    
    axis:轴。  0或'index',表示按行删除;1或'columns',表示按列删除。
    
    inplace:是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。
    
    limit:int, default None。如果method被指定,对于连续的空值,这段连续区域,最多填充前 limit 个空值(如果存在多段连续区域,每段最多填充前 limit 个空值)。如果method未被指定, 在该axis下,最多填充前 limit 个空值(不论空值连续区间是否间断)
    
    downcast:dict, default is None,字典中的项为,为类型向下转换规则。或者为字符串“infer”,此时会在合适的等价类型之间进行向下转换,比如float64 to int64 if possible。
    
    

    运算

    apply函数

    df.apply(lambda x: x.max() - x.min())     # 可以在apply中定义匿名函数使用
    
    

    字符串方法

    Series 的 str 属性包含一组字符串处理功能,str 的模式匹配默认使用正则表达式

    s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])
    s.str.lower()
    
    

    合并(Merge)

    结合(concat)

    pandas 提供了多种将Series,DataFrame对象组合在一起的功能,用索引与关联代数功能的多种设置逻辑可执行连接(join)与合并(merge)操作

    连接(join)

    追加(append)

    分组(grouping)

    group by 指的是涵盖下列一项或多项步骤的处理流程

    分割 :按条件把数据分割成多组

    应用 :为每组单独应用函数

    组合:将处理结果结合成一个数据结构

    重塑(reshaping)

    堆叠(stack)

    数据透视表(pivot tables)

    时间序列(timeseries)

    rng = pd.date_range('20200101',periods=10,freq='S')
    ts = pd.Series(np.random.randint(0,100,len(rng)),index=rng)
    
    # 时区表示
    ts.tz_localize('UTC')
    
    # 转换成其他时区
    ts_utc.tz_convert('US/Eastern')
    
    # 转换时间段
    
    

    类别型(categoricals)

    可视化

    DataFrame的 plot() 方法可以快速绘制所有带标签的列

    数据输入/输出

    CSV

    read_csv()
    # 读取csv文件
    pd.read_csv('foo.csv')
    # 参数说明
    filepath_or_buffer: FilePathOrBuffer,   ******* # 文件名或位置
    sep=default_sep,    # 分隔符
    delimiter=None,
    # 1.列和索引的位置和名称
    header="infer",
    names=None,
    index_col=None,    *******# 用作索引的列编号或者列名
    usecols=None,    *******# 返回数据子集,例:[0,1,2]或者 [‘foo’, ‘bar’, ‘baz’]
    squeeze=False,
    prefix=None,    *******# 在没有列标题的时候,给列添加前缀
    mangle_dupe_cols=True, # 将重复的列表示为X.0, X.1, X.2, 如果设定为false,会将所有重复的列名覆盖掉
    # 2.常规解析配置
    dtype=None,    # 每一类数据的数据类型
    engine=None,
    converters=None,    # 列转换函数的字典,key可以是列名或者列的序号
    true_values=None,
    false_values=None,
    skipinitialspace=False,
    skiprows=None,
    skipfooter=0,
    nrows=None,    # 需要读取的行数(从文件头开始算起)
    # 3.不适用和缺失数据处理
    na_values=None,
    keep_default_na=True,
    na_filter=True,  # 检查是否丢失值(空字符串或空值),对于数据集中没有空值,设定False可以提升读取速度
    verbose=False,
    skip_blank_lines=True,    # 如果为True,则跳过空行,否则记为NaN
    # 4.日期时间处理
    parse_dates=False, 
    infer_datetime_format=False,
    keep_date_col=False,
    date_parser=None,
    dayfirst=False,
    cache_dates=True,
    # 5.迭代
    iterator=False,
    chunksize=None,
    # 6.报价,压缩和文件格式
    compression="infer",
    thousands=None,    # 千分位分隔符
    decimal=b".",    # 字符中的小数点
    lineterminator=None,
    quotechar='"',
    quoting=csv.QUOTE_MINIMAL,
    doublequote=True,
    escapechar=None,
    comment=None,
    encoding=None,    *******# 指定字符集类型,通常指定为'utf-8'
    dialect=None,
    # 7.错误处理
    error_bad_lines=True,
    warn_bad_lines=True,
    # 8.内部
    delim_whitespace=False,
    low_memory=_c_parser_defaults["low_memory"],
    memory_map=False,
    float_precision=None,
    
    
    to_csv()
    # 写入CSV文件
    df.to_csv('foo.csv')
    # 参数说明
    path_or_buf=None,    # 路径
    sep=",",    # 分隔符
    na_rep="",    # 替换空值,缺失值保存为Na,如果不写,默认为空
    float_format=None,    # 格式,float_format='%.2f' 保留两位小数
    columns=None,    # 是否保留某列的值, columns=['name'] 保存索引列和name的值
    header=True,    # 是否保留列名,False不保留列名
    index=True,    # 是否保留索引行,False不保留
    index_label=None,
    mode="w",    # 如果需要在现有文件中追加,把 w 改成 a,前提是格式都一样 
    encoding=None,
    compression="infer",
    quoting=None,
    quotechar='"',
    line_terminator=None,
    chunksize=None,
    date_format=None,
    doublequote=True,
    escapechar=None,
    decimal=".",
    
    

    HDF5

    # 读取HDF5文件
    pd.read_hdf('foo.h5', 'df')
    
    # 写入HDF5
    df.to_hdf('foo.h5', 'df')
    
    

    Excel

    # 读取Excel文件
    pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA'])
    
    # 写入Excel
    df.to_excel('foo.xlsx', sheet_name='Sheet1')
    
    

    to_msgpack

    pandas.DataFrame.to_msgpack(path=None,encoding='utf-8',**kwargs)
    msgpack(序列化)对象以输入文件路径
    
    # 参数说明
    path    字符串文件路径,类似缓冲区的文件或无,如果为None,则返回生成的字符串
    append    布尔值是否追加到现有的msgpack,默认为False
    compress    压缩器的类型(zlib或blosc)默认为None(无压缩)
    
    

    基础用法

    df.columns = ['a','b','c']    # 更换列的值
    
    df.array()    # 用于提取数据,推荐使用
    
    df.to_numpy()   # 用于提取数据,推荐使用
    
    df.rename(columns={'adj_price_open': 'price_open'}, inplace=True)    # 更改列名
    inplace=True   # 不创建新的对象,直接对原始对象进行修改
    inplace=False  # 对数据进行修改,创建并返回新的对象承载其修改结果
    
    
    

    合并重叠数据集

    合并两个相似的数据集,一个中的数据比另一个多,合并后选择覆盖范围广的,使用 combin_first() 函数

    In [71]: df1 = pd.DataFrame({'A': [1., np.nan, 3., 5., np.nan],
       ....:                     'B': [np.nan, 2., 3., np.nan, 6.]})
       ....: 
    
    In [72]: df2 = pd.DataFrame({'A': [5., 2., 4., np.nan, 3., 7.],
       ....:                     'B': [np.nan, np.nan, 3., 4., 6., 8.]})
       ....: 
    
    In [73]: df1
    Out[73]: 
         A    B
    0  1.0  NaN
    1  NaN  2.0
    2  3.0  3.0
    3  5.0  NaN
    4  NaN  6.0
    
    In [74]: df2
    Out[74]: 
         A    B
    0  5.0  NaN
    1  2.0  NaN
    2  4.0  3.0
    3  NaN  4.0
    4  3.0  6.0
    5  7.0  8.0
    
    In [75]: df1.combine_first(df2)
    Out[75]: 
         A    B
    0  1.0  NaN
    1  2.0  2.0
    2  3.0  3.0
    3  5.0  4.0
    4  3.0  6.0
    5  7.0  8.0
    
    

    聚合函数使用

    sum()    # 求和
    
    mean()    # 返回平均值
    
    std()    # 返回标准差
    
    median()    # 所有值的中位数
    
    min()    # 最小值
    
    max()    # 最大值
    
    abs()    # 绝对值
    
    prod()    # 数据元素的乘积
    
    cumsum()    # 累计总和
    
    describe()    # 统计信息摘要
    
    
    
    

    索引

    重建索引

    重建索引会更改DataFrame的行标签和列标签,重新索引以为这符合数据以匹配特定轴上的一组给定的标签,可以通过索引实现多个操作

    1. 重新排序现有数据以匹配一组新的标签
    2. 在没有标签数据的标签位置插入缺失值标记
    df.reindex(index=[])    # 重建索引,如果指定的数据没有和此索引建立关联,新产生的表格就为NaN
    
    df.rename(index=[], columns=[])    # 索引重命名
    
    

    迭代

    iteritems() - 迭代(key,value)对
    
    iterrows() - 将行迭代为(索引,系列)对
    
    itertuples() - 以namedtuples的形式迭代行
    
    

    排序

    pandas排序有两种:按标签 按实际值

    df.sort_index()    # 按标签排
    
    df.sort_index(ascending=False)    # 排序顺序
    
    df.sort_index(axis=1)    # 按列排序
    
    df.sort_values(by='B')    # 按某一列的值排序
    
    

    合并连接

    Merge方法

    # Merge方法是基于共同列将两个dataFrame连接起来
    pd.merge(left,right,how="inner",on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=False,
             suffixes    # 合表中遇到相同的列名,给重复的列名增加后缀=("_x", "_y"),copy=True,indicator=False,validate=None,)
    
    # 参数说明
    left/right    # 左右位置的dataframe
    how    # 合并方式 left:基于左边dataframe列的数据合并,right:基于右边,outer:两者并集,inner,两者交集,默认是inner
    on    # 用来合并的列名,这个参数需要保证两个dataframe有相同的列名
    left_on/right_on    # 左右dataframe合并的列名,也可以为索引,数组和列表
    left_index/right_index    # 是否以index作为数据合并的列名,True表示是
    sort    # 根据dataframe合并的keys排序,默认是
    suffixes    # 合表中遇到相同的列名,给重复的列名增加后缀
    
    on参数:在实际应用中,如果右表的索引值正是左表的某一列的值,这时可以通过将右表的索引和左表的列对其合并,这样灵活的方式进行合并
    In [59]: left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
       ....:                      'B': ['B0', 'B1', 'B2', 'B3'],
       ....:                      'key': ['K0', 'K1', 'K0', 'K1']})
       ....: 
    
    In [60]: right = pd.DataFrame({'C': ['C0', 'C1'],
       ....:                       'D': ['D0', 'D1']},
       ....:                       index=['K0', 'K1'])
    
    result = left.join(right,on='Key')
             
    suffix后缀参数:如果和表合并的过程中遇到有一列两个表都同名,但是值不同,合并的时候又都想保留下来,就可以用suffixes给每个表的重复列名增加后缀。
    result = pd.merge(left, right, on='k', suffixes=['_l', '_r'])       
             
    组合多个dataframe:一次组合多个dataframe的时候可以传入元素为dataframe的列表或者tuple。
    right2 = pd.DataFrame({'v': [7, 8, 9]}, index=['K1', 'K1', 'K2'])
    result = left.join([right, right2])         
    
    

    concat方法

    concat方法是拼接函数,有行拼接和列拼接,默认是行拼接,拼接方式默认的是外拼接(并集),拼接对象是pandas数据类型

    pd.concat(objs,axis=0,join="outer",join_axes=None,ignore_index=False,keys=None,levels=None,names=None,verify_integrity=False,sort=None,copy=True)
    
    # 参数说明:
    objs:series,dtaframe或者panel构成的序列list,需要可迭代
    axis:需要合并连接的轴,0是行,1是列
    join:连接的方式,或者outer,  inner:两表的交集,outer:两者的并集
    keys:当axis=0的时候,按照行拼接,会加一列,表示这一列是哪一个表中的数据;axis=1的时候,按照列拼接,		会将列名改为对应的值,表示这一列是哪一个表中的数据
    join_axes:指定根据那个轴来对齐数据    join_axes=[df.index]
    ignore_index:设置为True,合并的两个表就会根据列字段对齐,然后合并,最后再重新整理一个新的index
    
    ********************** Series类型的拼接方法  ********************** 
    # 例1:行拼接
    df1 = pd.Series([1.1,2.2,3.3],index=['i1','i2','i3'])
    df2 = pd.Series([4.4,5.5,6.6],index=['i2','i3','i4'])
    
    pd.concat([df1,df2])
    
    行拼接如果有相同的索引,为了区分索引,我们在最外层定义了索引的分组情况
    # 对行拼接分组
    pd.concat([df1,df2],keys=['fea1','fea2'])
    
    # 例2:列拼接
    默认以并集的方式拼接
    pd.concat([df1,df2],axis=1)     # axis=0  行拼接   axis=1  列拼接
    
    列拼接的内连接(交),取相同的部分
    pd.concat([df1,df2],axis=1,join='inner')
    
    设置列拼接的列名(交)
    pd.concat([df1,df2],axis=1,join='inner',keys=['fea1','fea2'])
    
    指定索引[i1,i2,i3]的列拼接
    pd.concat([df1,df2],axis=1,join_axes=[['i1','i2','i3']])
    
    
    ********************** DataFrame类型的拼接方法  ********************** 
    # 行拼接
    df1 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3', 'K4', 'K5'], 'A': ['A0', 'A1', 'A2', 'A3', 'A4', 'A5']})
    df2 = pd.DataFrame({'key': ['K0', 'K1', 'K2'],'B': ['B0', 'B1', 'B2']})
    
    pd.concat([df1,df2])
    
    # 列拼接
    pd.concat([df1,df2],axis=1)
    
    若列拼接或行拼接有重复的列名和行名,则报错
    # 判断是否有重复的列名,若有则报错
    pd.concat([df1,df2],axis=1,verify_integrity = True)
    
    

    append方法

    dataframe 数据类型的方法,提供了行方向的拼接操作

    DataFrame.append(other, ignore_index=False, verify_integrity=False, sort=None)
    
    # 功能说明:
    向DataFrame对象中添加新的行,如果添加的列名不在DataFrame对象中,将会被当作新的列进行添加
    
    # 参数说明
    other    # DataFrame,Series,dict,list这样的数据结构
    ignore_index    # 默认值为False,如果为True,则不适用index标签
    verify_integrity    # 默认值为False,如果为True,当创建相同的index时会抛出ValueError的异常
    sort    # 默认是None
    
     df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                            'B': ['B0', 'B1', 'B2', 'B3'],
                            'C': ['C0', 'C1', 'C2', 'C3'],
                            'D': ['D0', 'D1', 'D2', 'D3']})
    df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
                            'B': ['B4', 'B5', 'B6', 'B7'],
                            'C': ['C4', 'C5', 'C6', 'C7'],
                            'D': ['D4', 'D5', 'D6', 'D7']})
    
    df3 = df1.append(df2, ignore_index=True)   # 如果不使用ignore_index=True,会出现多个相同的索引
    
    result = df1.append([df2, df3])    # 可以添加多个
    
    

    join方法

    dataframe 数据类型的方法,提供了列方向的拼接操作,支持左联,右联,内联,外联四种

    DataFrame.join(other, on=None, how=’left’, lsuffix=”, rsuffix=”, sort=False)
    
    # 功能说明
    通过索引或者指定的连接两个DataFrame,通过一个list可以一次高效的连接多个DataFrame
    
    # 参数说明
    other    # DataFrame,或者带有名字的Series,或者DataFrame的list,如果传递的是Series,那么其name属性应当是一个集合,并且该集合将会作为结果DataFrame的列名
    on    # 列名称,或者列名称的list/tuple,或者类似形状的数组,连接的列,默认使用索引连接
    how    # {‘left’, ‘right’, ‘outer’, ‘inner’}, default: ‘left’,连接的方式,默认为左连接
    lsuffix    # string,左DataFrame中重复列的后缀
    rsuffix    # string,右DataFrame中重复列的后缀
    sort    # boolean, default False,按照字典顺序对结果在连接键上排序。如果为False,连接键的顺序取决于连接类型(关键字)。
    
    
    

    pandas删除行

    1.指定删除行数删除     .drop([i,j])
    .drop([i,j])方法如果不设置参数inplace=True,则只能在生成的新数据块中实现删除效果,而不能删除原有数据块的相应行,设置后直接在原有的数据块上进行操作
    
    

    pandas删除列

    1.pop()删除     df.pop([指定列])
    .pop([])方法可以将所选列从原数据快中弹出,原数据块不在保留该列
    
    2.drop()删除    df.drop([],axis=1)
    df.drop([],axis=1) 方法既可以保留原数据块中的所选列,也可以删除,这取决于inplace
    当inplace=True时,执行内部删除,不返回任何值,原数据发生变化
    当inplace=False,执行内部删除,有返回值,生成新的df
    
    

    常用方法

    df["gender"].unique     查看某一列的唯一值
    df["gender"].value_counts(dropna=False)    查看看某一列值分布
    df.values     查看数据表的值,返回的是arry对象,列表套列表,一行数据一个小列表
    df.rename(columns={"gender":"性别"})   更改列名称
    df['education'].drop_duplicates()     删除后出现的重复值
    df['education'].drop_duplicates(keep='last')   删除先出现的重复值
    df['education'].replace('本科','大学')    数据替换
    
    merge,join,concat    数据表合并
    pd.merge(df1,df2,on='id',how='inner')   交集合并,按照id列
    pd.merge(df1,df2,on='id',how='left')   按左边合并
    pd.merge(df1,df2,on='id',how='right')   按右边合并
    
    pd.merge(df1,df2,on='id',how='outer')   按照并集合并,两者共同的部分,没有的部分使用Nan替换
    merge参数_(self, left, right, how, on, left_on, right_on, axis, left_index, right_index, sort, suffixes, copy, indicator, validate)
    
    result = df.append(df1)    新增
    
    df.set_index('id')    设置索引
    df.reset_index(drop=True)   删除索引
    df.sort_values(by=['age'])   按照特定的列排序
    df.sort_index()    按照索引列排序
    
    # 数据提取
    loc:按标签值进行提取   iloc:按位置进行提取
        
    df.columns     获取所有列,返回的是列表的形式
    
    
    

    pandas常用函数

    # shift()    # 对数据进行移动操作,索引不移动
    df.shift()    # 将本列数据整体向下移动,移动后的空格使用NaN填充
    df.shift(-1)    # 将本例数据整体向上移动一格,移动后的空格使用NaN填充
    
    # diff()    # 两条临近记录的差值
    
    
    

    pandas操作文件

    import pandas as pd
    
    pd.read_csv(file_path,)       读取csv文件
    pd.to_csv(file_path)         写入csv文件
    df.astype(int)             将对象转换成int类型
    
    

    时间戳字符串转换

    import time
    import datetime
    import pandas as pd
    
    # 时间字符串转换成时间戳
    a1 = "2019-5-10 23:40:00"
    # 先转换为时间数组
    timeArray = time.strptime(a1, "%Y-%m-%d %H:%M:%S")
    timeStamp = int(time.mktime(time.strptime(a1, "%Y-%m-%d %H:%M:%S")))
    print(timeStamp)    
    # 1557502800
    
    
    # 字符串转换成时间戳
    d = '201703270000'
    sss = time.mktime(datetime.datetime.strptime(d, "%Y%m%d%H%M%S").timetuple())
    print(sss)
    # 1490544000.0
    
    
    # 时间戳转换成时间字符串
    dd = 1490544000.0
    dt = pd.to_datetime(dd, unit='s')
    print(dt)
    # 2017-03-26 16:00:00
    
    
    
  • 相关阅读:
    Visual studio 2008中添加manifest文件
    SqlServer2008R2安装
    今天在Google上搜我的名字,具然埔客园排在第一位。
    今天又到此一游,原因,是为了寻找传说中的Team foundation server,很难找呀,这个东东。
    硬件基础知识
    循环冗余检验应用
    【转】网络变压器的作用
    PADS无模命令总结
    单片机后缀说明
    QuartusII之Warning警告分析
  • 原文地址:https://www.cnblogs.com/whkzm/p/13783124.html
Copyright © 2011-2022 走看看