详解Pandas用法_02

原文地址:http://www.huaxiaozhuan.com/%E5%B7%A5%E5%85%B7/pandas/chapters/pandas.html

目录

 

六、数据清洗

1. 移除重复数据

2. apply

3. 缺失数据

4. 离散化

七、 字符串操作

八、 聚合与分组

1. 分组

2. GroupBy对象

3. 分组级运算

4. 透视表和交叉表

九、时间序列

1. Python 中的时间

2. 时间点 Timestamp

3. 时间段 Period

4. DatetimeIndex

5. PeriodIndex

6. resample 和频率转换

十、 DataFrame 绘图

 

十二、 数据加载和保存

1. 文本文件

2. Json

3. 二进制文件

4. Excel 文件

5. HTML 表格

6. SQL


六、数据清洗

1. 移除重复数据

  1. Series/DataFrame.duplicated(*args, **kwargs):返回一个布尔Series,指示调用者中,哪些行是重复的(重复行标记为True)。

    • keep:一个字符串或者False,指示如何标记。它代替了废弃的参数take_last

      • 'first':对于重复数据,第一次出现时标记为False,后面出现时标记为True
      • 'last':对于重复数据,最后一次出现时标记为False,前面出现时标记为True
      • False:对于重复数据,所有出现的地方都标记为True

    Series/DataFrame.drop_duplicates(*args, **kwargs):返回重复行被移除之后的Series/DataFrame

    • keep:一个字符串或者False,指示如何删除。 它代替了废弃的参数take_last

      • 'first':对于重复数据,保留第一次出现,后面出现时删除
      • 'last':对于重复数据,最后一次出现时保留,前面出现时删除
      • False:对于重复数据,删除所有出现的位置
    • inplace:一个布尔值。如果为True,则原地修改。否则返回新建的对象。

    对于DataFrame,还有个 subset参数。它是column label或者其列表,给出了考虑哪些列的重复值。默认考虑所有列。(即一行中哪些字段需要被考虑)

    duplicates0 详解Pandas用法_02_第1张图片 详解Pandas用法_02_第2张图片

2. apply

  1. 你可以使用numpyufunc函数操作pandas对象。

  2. 有时,你希望将函数应用到由各列或者各行形成的一维数组上,此时DataFrame.apply()方法即可实现此功能。 .apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)

    • func:一个可调用对象,它会应用于每一行或者每一列
    • axis:指定应用于行还是列。如果为0/'index',则沿着0轴计算(应用于每一列);如果为1/'columns',则沿着1轴计算(应用于每一行)。
    • broadcast:一个布尔值,如果为True,则结果为DataFrame(不足的部分通过广播来填充)
    • raw:一个布尔值。如果为False,则转换每一行/每一列为一个Series,然后传给 func 作为参数。如果True,则func接受到的是ndarray,而不是Series
    • reduce:一个布尔值。用于判断当DataFrame为空时,应该返回一个Series还是返回一个DataFrame。如果为True,则结果为Series;如果为False,则结果为DataFrame
    • args:传递给func的额外的位置参数(第一个位置参数始终为Series/ndarray详解Pandas用法_02_第3张图片
  3. 有时,你希望将函数应用到DataFrame中的每个元素,则可以使用.applymap(func)方法。之所以不叫map,是因为Series已经有个.map方法。 详解Pandas用法_02_第4张图片

  4. Series.apply()方法应用到Series的每个元素上: .apply(func, convert_dtype=True, args=(), **kwds)

    • func:一个可调用对象,它会应用于每个元素
    • convert_dtype:一个布尔值。如果为True,则pandas会自动匹配func结果的最佳dtype;如果为False,则dtype=object
    • args:传递给func的额外的位置参数。
    • kwds:传递给func的额外的关键字参数。

    返回结果可能是Series,也可能是DataFrame(比如,func返回一个Series详解Pandas用法_02_第5张图片

  5. Series.map(arg,na_action=None)方法会应用到Series的每个元素上:

    • arg:一个函数、字典或者Series。如果为字典或者Series,则它是一种映射关系,键/index label就是自变量,值就是返回值。
    • na_action:如果为ignore,则忽略NaN

    返回相同index的一个Series 详解Pandas用法_02_第6张图片

3. 缺失数据

  1. pands对象上的所有描述统计都排除了缺失数据。 详解Pandas用法_02_第7张图片

  2. DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False):根据各label的值中是否存在缺失数据来对轴label进行过滤。

    • axis:指定沿着哪个轴进行过滤。如果为0/'index',则沿着0轴;如果为1/'columns',则沿着1轴。你也可以同时提供两个轴(以列表或者元组的形式)
    • how:指定过滤方式。如果为'any',则如果该label对应的数据中只要有任何NaN,则抛弃该label;如果为'all',则如果该label对应的数据中必须全部为NaN才抛弃该label
    • thresh:一个整数,要求该label必须有thresh个非NaN才保留下来。它比how的优先级较高。
    • subset:一个labelarray-like。比如axis=0,则subset为轴 1 上的标签,它指定你考虑哪些列的子集上的NaN
    • inplace:一个布尔值。如果为True,则原地修改。否则返回一个新创建的DataFrame

    对于Series,其签名为: Series.dropna(axis=0, inplace=False, **kwargs)

    详解Pandas用法_02_第8张图片 详解Pandas用法_02_第9张图片 详解Pandas用法_02_第10张图片

  3. DataFrame/Series.fillna(value=None, method=None, axis=None, inplace=False, limit=None,downcast=None, **kwargs):用指定值或者插值方法来填充缺失数据。

    • value:一个标量、字典、Series或者DataFrame。注意:valuemethod只能指定其中之一,不能同时提供。

      • 如果为标量,则它指定了填充NaN的数据。
      • 如果为Series/dict,则它指定了填充每个index的数据
      • 如果为DataFrame,则它指定了填充每个DataFrame单元的数据
    • method:指定填充方式。可以为None,也可以为:

      • 'backfill'/'bfill':使用下一个可用的有效值来填充(后向填充)
      • 'ffill'/'pad':使用前一个可用的有效值来填充(前向填充)
    • axis:指定沿着哪个轴进行填充。如果为0/'index',则沿着0轴;如果为1/'columns',则沿着1轴

    • inplace:一个布尔值。如果为True,则原地修改。否则返回一个新创建的DataFrame

    • limit:一个整数。如果method提供了,则当有连续的NNaN时,只有其中的limitNaN会被填充(注意:对于前向填充和后向填充,剩余的空缺的位置不同)

    • downcast:一个字典,用于类型转换。字典形式为: {label->dtype}dtype可以为字符串,也可以为np.float64等。

    详解Pandas用法_02_第11张图片 详解Pandas用法_02_第12张图片 详解Pandas用法_02_第13张图片

  4. DataFrame/Series.isnull():返回一个同样尺寸的布尔类型的对象,来指示每个值是否是null

    DataFrame/Series.notnull():返回一个同样尺寸的布尔类型的对象,来指示每个值是否是not null 详解Pandas用法_02_第14张图片

  5. fillna()方法可以看作是值替换的一种特殊情况。更通用的是值替换replace()方法。

     

     

     
      Series/DataFrame.replace(to_replace=None, value=None, inplace=False, limit=None, 
      regex=False, method='pad', axis=None) 
    • to_replace:一个字符串、正则表达式、列表、字典、Series、数值、None。指示了需要被替换的那些值

      • 字符串:则只有严格等于该字符串的那些值才被替换

      • 正则表达式:只有匹配该正则表达式的那些值才被替换(regex=True

      • 列表:

        • 如果to_placevalue都是列表,则它们必须长度严格相等
        • 如果regex=True,则列表中所有字符串都是正则表达式。
      • 字典:字典的键对应了被替换的值,字典的值给出了替换值。如果是嵌套字典,则最外层的键给出了column

      • None:此时regex必须是个字符串,该字符串可以表示正则表达式、列表、字典、ndarray等。如果value也是None,则to_replace必须是个嵌套字典。

    • value:一个字符串、正则表达式、列表、字典、Series、数值、None。给出了替换值。如果是个字典,则键指出了将填充哪些列(不在其中的那些列将不被填充)

    • inplace:一个布尔值。如果为True,则原地修改。否则创建新对象。

    • limit:一个整数,指定了连续填充的最大跨度。

    • regex:一个布尔值,或者与to_replace类型相同。

      • 如果为True,则to_replace必须是个字符串。
      • 如果是个字符串,则to_replace必须为None,因为它会被视作过滤器
    • method:指定填充类型。可以为'pad'/'ffill'/'bfill'。当to_replace是个列表时该参数有效。

    详解Pandas用法_02_第15张图片 详解Pandas用法_02_第16张图片 详解Pandas用法_02_第17张图片

  6. interpolate是通过前后数据插值来填充NaN

     

     

     
      Series/DataFrame.interpolate(method='linear', axis=0, limit=None, inplace=False,
      limit_direction='forward', downcast=None, **kwargs)
    • method:一个字符串,指定插值的方法。

      • 'linear':线性插值。只有它支持MultiIndex
      • 'index'/'values':使用索引标签的整数下标来辅助插值
      • 'nearest', 'zero', 'slinear', 'quadratic', 'cubic',

      'barycentric', 'polynomial'使用scipy.interpolate.interp1d。对于'polynomial'/'spline',你需要传入一个order(一个整数)

      • 'krogh', 'piecewise_polynomial', 'spline', 'pchip','akima'也使用了scipy的插值算法。它们使用索引标签的整数下标来辅助插值。
      • 'time': interpolation works on daily and higher resolution data to interpolate given length of interval
    • axis:指定插值的轴。如果为0/'index'则沿着0 轴;如果为1/'columns'则沿着 1 轴

    • limit:一个整数,指定插值时,如果有K个连续的NaN,则只插值其中的limit

    • limit_direction:一个字符串。当设定了limit时,指定处理前面limitNaN,还是后面limitNaN。可以为'forward'/'backward'/'both'

    • inplace:一个布尔值。如果为True,则原地修改。否则创建新对象。

    • downcast:指定是否自动向下执行类型转换、

    • 其他参数是传递给scipy的插值函数的。

    详解Pandas用法_02_第18张图片 详解Pandas用法_02_第19张图片 详解Pandas用法_02_第20张图片

4. 离散化

  1. 连续数据常常会被离散化或者拆分成面元bin。可以通过pandas.cut()函数来实现:

     

     

     
      pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3,
      include_lowest=False)
    • x:一维的数据。

    • bins:一个整数或者一个序列。

      • 整数:它指定了划分区间的数量。每个区间是等长的,且最左侧的区间的左侧比x最小值小0.1%;最右侧的区间的右侧比x最大值大0.1%
      • 一个序列:它给出了bins的每个划分点。
    • right:一个布尔值。如果为True,则区间是左开右闭;否则区间是左闭右开的区间。

    • labels:一个array或者None。如果为一个array,则它指定了结果binslabel(要求长度与bins数量相同)。如果为None,则使用区间来表示。

    • retbins:一个布尔值。如果为True,则返回bins

    • precision:一个整数,给出存储和显示bin label的精度

    • include_lowest:一个布尔值。如果为True,则最左侧bin的左侧是闭区间

    返回的是一个Categorical对象或者Series对象。该函数类似于numpy.histogram()函数。

  2. 另外一个划分的函数是:

     

     

     
     pandas.qcut(x, q, labels=None, retbins=False, precision=3)
    • q:一个整数或者序列。

      • 整数:它指定了划分区间的数量。
      • 一个序列:它给出了百分比划分点。比如[0,0.25,0.5,0.75,0.1]0.25代表25%划分点。如果数据不在任何区间内,则标记为NaN
    • 其他参数与cut相同。(qcut没有bins参数)

    详解Pandas用法_02_第21张图片 详解Pandas用法_02_第22张图片 详解Pandas用法_02_第23张图片

七、 字符串操作

  1. 通过Series.map()方法,所有字符串和正则表达式方法都能应用于各个值。但是如果存在NaN就会报错。为了解决这个问题,pandas提供了一些能够跳过NaN值的字符串操作方法。

  2. Series.str能够将Series的值当作字符串处理,并且你可以通过Series.str.func来应用某些函数。其中func可以为:

    • Series.str.capitalize()
    • Series.str.cat([others, sep, na_rep])
    • Series.str.center(width[, fillchar])
    • Series.str.contains(pat[, case=True, flags=0, na=nan, regex=True])
    • Series.str.count(pat[, flags])
    • Series.str.decode(encoding[, errors])
    • Series.str.encode(encoding[, errors])
    • Series.str.endswith(pat[, na])
    • Series.str.extract(pat[, flags, expand])
    • Series.str.extractall(pat[, flags])
    • Series.str.find(sub[, start, end])
    • Series.str.findall(pat[, flags])
    • Series.str.get(i)
    • Series.str.index(sub[, start, end])
    • Series.str.join(sep)
    • Series.str.len()
    • Series.str.ljust(width[, fillchar])
    • Series.str.lower()
    • Series.str.lstrip([to_strip])
    • Series.str.match(pat[, case=True, flags=0, na=nan, as_indexer=False])
    • Series.str.normalize(form)
    • Series.str.pad(width[, side, fillchar])
    • Series.str.partition([pat, expand])
    • Series.str.repeat(repeats)
    • Series.str.replace(pat, repl[, n, case, flags])
    • Series.str.rfind(sub[, start, end])
    • Series.str.rindex(sub[, start, end])
    • Series.str.rjust(width[, fillchar])
    • Series.str.rpartition([pat, expand])
    • Series.str.rstrip([to_strip])
    • Series.str.slice([start, stop, step])
    • Series.str.slice_replace([start, stop, repl])
    • Series.str.split([pat, n, expand])
    • Series.str.rsplit([pat, n, expand])
    • Series.str.startswith(pat[, na])
    • Series.str.strip([to_strip])
    • Series.str.swapcase()
    • Series.str.title()
    • Series.str.translate(table[, deletechars])
    • Series.str.upper()
    • Series.str.wrap(width, **kwargs)
    • Series.str.zfill(width)
    • Series.str.isalnum()
    • Series.str.isalpha()
    • Series.str.isdigit()
    • Series.str.isspace()
    • Series.str.islower()
    • Series.str.isupper()
    • Series.str.istitle()
    • Series.str.isnumeric()
    • Series.str.isdecimal()
    • Series.str.get_dummies([sep])

    详解Pandas用法_02_第24张图片

  3. 你也可以通过Series.str[:3]这种索引操作来进行子串截取。或者使用Series.str.get()方法进行截取。 详解Pandas用法_02_第25张图片

八、 聚合与分组

1. 分组

  1. 分组运算的过程为:拆分-应用-合并

    • 拆分阶段:Series/DataFrame等数据根据你提供的一个或者多个键,被拆分为多组
    • 应用阶段:根据你提供的一个函数应用到这些分组上
    • 合并阶段:将函数的执行结果合并到最终结果中
  2. 分组中有两种数据:源数据(被分组的对象),分组数据(用于划分源数据的)。

    • 源数据每一行(axis=0) 对应于分组数据中的一个元素。分组数据中每一个唯一值对应于一个分组。
    • 当分组数据也在源数据中时,可以直接通过指定列名来指定分组数据(值相同的为同一组)。
  3. .groupby()方法是分组方法:

     

     

     
      Series/DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, 
      group_keys=True, squeeze=False, **kwargs)
    • by:一个mapping functionlist of function、一个字典、一个序列、一个元组、一个list of column name。它指定了分组数据。

      • 如果传入了函数,则在每个index value上调用函数来产生分组数据

      • 如果是Series或者字典,则根据每个index value在字典/Series中的值来产生分组数据

      • 如果是个column label,则使用该label抽取出来的一列数据产生分组数据

      • 如果是个column labellist,则使用一组column label抽取出来的多列数据作为分组数据。

      • 如果是个序列,则它直接指定了分组数据。

      • 如果是个序列的序列,则使用这些序列拼接成一个MulitiIndex,然后根据这个MultiIndex替换掉index后,根据label value来分组。(事实上并没有替换,只是用于说明这个过程)

        如果axis=1,则index label替换成column label

    • axis:指定沿着哪个轴分组。可以为0/'index',表示沿着 0轴。可以为1/'columns',表示沿着 1轴

    • level:一个整数、level name或者其序列。如果axis是个MultiIndex,则在指定级别上的索引来分组

    • as_index:一个布尔值。如果为True,则将group label作为输出的index。如果为False,则输出是SQL风格的分组(此时分组的key作为一列,而不是作为index)。Series中,该参数必须为True

    • sort:一个布尔值。如果为True,则对分组的键进行排序。

    • group_keys:一个布尔值。如果为True,且调用了函数来决定分组,则添加分组键来区分不同的数据(否则你不知道每一行数据都对应于哪里)

    • squeeze:一个布尔值。如果为True,则尽可能的缩减结果的类型。

    该函数返回一个GroupBy对象。

    详解Pandas用法_02_第26张图片 详解Pandas用法_02_第27张图片 详解Pandas用法_02_第28张图片

  4. 我们可以使用dtype来分组,此时by=df.dtypes,axis=1: 详解Pandas用法_02_第29张图片

  5. 对于由DataFrame产生的GroupBy对象,我们可以用一个或者一组列名对其索引。它其实一个语法糖。

    • 如果索引是一个列名,则df.groupby('key1')['data1'] 等价于df['data1'].groupby(df['key1'])

    • 如果索引是一个元组和序列,则 df.groupby('key1')[['data1','data2']] 并不等价于 df[['data1','data2']].groupby(df['key1']),而是等同于 df.groupby(df['key1'])

      • 之所以用 [['data1','data2']],是因为df[['data1','data2']]df['data1','data2']语义不同。后者表示某个label是个元组,该元组的值为'data1','data2'

详解Pandas用法_02_第30张图片

2. GroupBy对象

  1. GroupBy对象是一个迭代器对象。迭代结果产生一组二元元组(由分组名和数据块组成)。

    • 如果有多重键,则元组的第一个元素将是由键组成的元组。
    • dict(list(GroupBy_obj))将生产一个字典,方便引用

    详解Pandas用法_02_第31张图片 详解Pandas用法_02_第32张图片

    • GroupBy.groups属性返回一个字典: {group name->group labels}
    • GroupBy.indices属性返回一个字典:{group name->group indices}

    详解Pandas用法_02_第33张图片

  2. GroupBy的统计函数有(排除了NaN):

    • GroupBy.count() :计算各分组的非NaN的数量
    • GroupBy.cumcount([ascending]):计算累积分组数量
    • GroupBy.first():计算每个分组的第一个非NaN
    • GroupBy.head([n]) :返回每个分组的前 n个值
    • GroupBy.last() :计算每个分组的最后一个非NaN
    • GroupBy.max():计算每个分组的最大值
    • GroupBy.mean(*args, **kwargs):计算每个分组的均值
    • GroupBy.median():计算每个分组的中位数
    • GroupBy.min():计算每个分组的最小值
    • GroupBy.nth(n[, dropna]):计算每个分组第n行数据。 如果n是个整数列表,则也返回一个列表。
    • GroupBy.ohlc():计算每个分组的开始、最高、最低、结束值
    • GroupBy.prod():计算每个分组的乘
    • GroupBy.size():计算每个分组的大小(包含了NaN
    • GroupBy.sem([ddof]) :计算每个分组的sem(与均值的绝对误差之和)
    • GroupBy.std([ddof]) :计算每个分组的标准差
    • GroupBy.sum():计算每个分组的和
    • GroupBy.var([ddof]):计算每个分组的方差
    • GroupBy.tail([n]) :返回每个分组的尾部 n个值

    另外SeriesGroupBy/DataFrameGroupBy也支持Series/DataFrame的统计类方法以及其他方法:

     

     

     
      #SeriesGroupBy - DataFrameGroupBy 都有的方法:
      .agg(arg, *args, **kwargs)
      .all([axis, bool_only, ...]) 
      .any([axis, bool_only, ...])
      .bfill([limit])
      .corr([method, min_periods])
      .count() 
      .cov([min_periods]) 
      .cummax([axis, skipna]) 
      .cummin([axis, skipna]) 
      .cumprod([axis]) 
      .cumsum([axis]) 
      .describe([percentiles, ...]) 
      .diff([periods, axis])   
      .ffill([limit]) 
      .fillna([value, method, ...]) 
      .hist(data[, column, by, ...]) 
      .idxmax([axis, skipna]) 
      .idxmin([axis, skipna]) 
      .mad([axis, skipna, level])
      .pct_change([periods, ...]) 
      .plot 
      .quantile([q, axis, ...]) 
      .rank([axis, method, ...]) 
      .resample(rule, *args, **kwargs) 
      .shift([periods, freq, axis])
      .size() 
      .skew([axis, skipna, level, ...]) 
      .take(indices[, axis, ...])
      .tshift([periods, freq, axis]) 
      #SeriesGroupBy独有的方法
      SeriesGroupBy.nlargest(*args, **kwargs) 
      SeriesGroupBy.nsmallest(*args, **kwargs) 
      SeriesGroupBy.nunique([dropna]) 
      SeriesGroupBy.unique()
      SeriesGroupBy.value_counts([normalize, ...])   
      #DataFrameGroupBy独有的方法
      DataFrameGroupBy.corrwith(other[, axis, drop]) 
      DataFrameGroupBy.boxplot(grouped[, ...]) 

    详解Pandas用法_02_第34张图片 详解Pandas用法_02_第35张图片

  3. 如果你希望使用自己的聚合函数,只需要将其传入.aggregate(func, *args, **kwargs)或者.agg()方法即可。其中func接受一维数组,返回一个标量值。

    • 注意:自定义聚合函数会慢得多。这是因为在构造中间分组数据块时存在非常大的开销(函数调用、数据重排等)
    • 你可以将前面介绍的GroupBy的统计函数名以字符串的形式传入。
    • 如果你传入了一组函数或者函数名,则得到的结果中,相应的列就用对应的函数名命名。如果你希望提供一个自己的名字,则使用(name,function)元组的序列。其中name用作结果列的列名。
    • 如果你希望对不同的列采用不同的聚合函数,则向agg()传入一个字典。字典的键就是列名,值就是你希望对该列采用的函数。

    详解Pandas用法_02_第36张图片 详解Pandas用法_02_第37张图片

  4. .get_group(key)可以获取分组键对应的数据。

    • key :不同的分组就是依靠它来区分的
  5. GroupBy的下标操作将获得一个只包含源数据中指定列的新GroupBy对象

  6. GroupBy类定义了__getattr__()方法,当获取GroupBy中未定义的属性时:

    • 如果属性名是源数据对象的某列的名称则,相当于GroupBy[name],即获取针对该列的GroupBy对象
    • 如果属性名是源数据对象的方法,则相当于通过.apply(name)对每个分组调用该方法。

3. 分组级运算

  1. agg/aggregate只是分组级运算其中的一种。它接受一维数组,返回一个标量值。

  2. transform是另一个分组级运算。它也接受一维数组。只能返回两种结果:要么是一个标量值(该标量值将被广播),或者一个相同大小的结果数组。

    • 你无法通过字典来对不同的列进行不同的transform
     

     

     
      GroupBy.transform(func, *args, **kwargs)

    详解Pandas用法_02_第38张图片

  3. apply是另一个分组级运算。它是最一般化的分组级运算。它将待处理的对象拆分成多个片段,然后对各个片段调用传入的函数,最后尝试将各个片段组合到一起。

     

     

     
      GroupBy.apply(func, *args, **kwargs) 
    • func:运算函数。其第一个位置参数为待处理对象。其返回值是一个标量值或者pandas对象。
    • args/kwargs是传递给func的额外的位置参数与关键字参数。

    对于DataFrame.groupby时,传递给func的第一个参数是DataFrame;对于Series.groupby,传递给func的第一个参数是Series

    详解Pandas用法_02_第39张图片

  4. pd.cut()/qcut()函数返回的是Categorical对象。我们可以用它作为.groupby()by参数的值。这样可以实现桶分析。 详解Pandas用法_02_第40张图片

4. 透视表和交叉表

  1. 透视表pivot table是一种数据汇总工具。它根据一个或者多个键对数据进行聚合,并根据行和列上的分组键将数据分配到各个单元格中。

    • 你可以通过.groupby功能以及索引的变换来手工实现这种功能
  2. DataFrame.pivot_table()方法,以及pandas.pivot_table()函数都可以实现这种功能

     

     

     
      pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', 
      fill_value=None, margins=False, dropna=True, margins_name='All')
    • data:一个DataFrame对象
    • values:指定哪些列将被聚合。默认聚合所有的数值列。
    • index:一个index label、一个Grouper、一个数组,或者前面这些类型的一个列表。它指定关于分组的列名或者其他分组键,出现在结果透视表的行
    • columns:一个column label、一个Grouper、一个数组,或者前面这些类型的一个列表。它指定关于分组的列名或者其他分组键,出现在结果透视表的列
    • aggfunc:一个函数或者函数的列表。默认为numpy.mean。它作为聚合函数。如果为函数的列表,则结果中会出现多级索引,函数名就是最外层的索引名。
    • fill_value:一个标量,用于替换NaN
    • margins:一个布尔值。如果为True,则添加行/列的总计。
    • dropna:一个布尔值。如果为True,则结果不包含这样的列:该列所有元素都是NaN
    • margins_name:一个字符串。当margins=True时,margin列的列名。

    pivot_table0 详解Pandas用法_02_第41张图片 详解Pandas用法_02_第42张图片

  3. 交叉表cross-tabulation:crosstab是一种用于计算分组频率的特殊透视表。我们可以使用pivot_table()函数实现透视表的功能,但是直接使用更方便:

     

     

     
      pandas.crosstab(index, columns, values=None, rownames=None, colnames=None, 
      aggfunc=None, margins=False, dropna=True, normalize=False) 
    • index:一个array-likeSeries或者前两种的列表。它给出了行的计算频数的数据。

    • columns:一个array-likeSeries或者前两种的列表。它给出了列的计算频数的数据。

    • values:一个array-like,该数据用于聚合。如果出现了values,则必须提供aggfunc

    • aggfunc:一个函数对象,是聚合函数。如果出现了aggfunc,则必须提供values

    • rownames:一个序列。如果非空,则必须和结果的row indexlevel数量相等

    • colnames:一个序列。如果非空,则必须和结果的column indexlevel数量相等

    • margins:一个布尔值。如果为True,则添加行/列的总计。

    • dropna:一个布尔值。如果为True,则结果不包含这样的列:该列所有元素都是NaN

    • normalize:一个布尔值、字符串('all'/'index'/'columns')、或者整数0/1。它指定是否进行归一化处理(归一化为频率),否则就是频数。

      • 如果'all'/True,则对所有数据进行归一化
      • 如果为'index':则对每一行归一化
      • 如果为'columns':则对每一列归一化
      • 如果marginsTrue,则对margins也归一化。

    values的作用是这样的:首先根据index-columns建立坐标。行坐标来自index,列坐标来自columns。在index-columns-values中,同一个坐标下的values组成Series。这个Seriesaggfunc进行聚合,aggfunc接受一个Series,返回一个标量。此时就不再是对坐标点进行计数了,而是对values进行聚合。

    详解Pandas用法_02_第43张图片 详解Pandas用法_02_第44张图片详解Pandas用法_02_第45张图片

九、时间序列

  1. Pandas 提供了表示时间点、时间段、时间间隔等三种与时间有关的类型,以及元素为这些类型的索引对象。pandas还提供了许多与时间序列相关的函数。

1. Python 中的时间

  1. Python中,关于时间、日期处理的库有三个:timedatetimeCalendar。其中:datetime又有datetime.date/datetime.time/datetime.datetime三个类

1.1 时区

  1. 所有的时间都有一个时区。同样一个时间戳,根据不同的时区,它可以转换成不同的时间。
  2. pytz模块的common_timezones可以获取常用的表示时区的字符串。你可以通过pytz.timezone('timezone_str')来创建时区对象。 timezone

1.2 time 模块

  1. time模块中,时间有三种表现形式:

    • Unix时间戳。指的是从1970年以来的秒数
    • 本地时间的struct_time形式:一个命名元组,第一位为年、第二位为月....
    • UTC时间的struct_time的形式:类似于上面的,只是为UTC时间。区别在于:前者是本地时间local time,后者是UTC时间
  2. 查看当前时间的三种表现形式:

    • Unix时间戳: time.time()
    • local struct_timetime.localtime()
    • utc struct_timetime.gmtime()

    详解Pandas用法_02_第46张图片

  3. 三种格式之间的转换:

    • timestamp--->local timetime.localtime(time_stamp)
    • timestamp--->utc timetime.gmtime(time_stamp)
    • local time--->timestamptime.mktime(local_time)
    • utc time---> timestampcalendar.timegm(utc_time)

    详解Pandas用法_02_第47张图片

  4. 三种格式的时间转换为字符串:

    • timestamptime.ctime(time_stamp)
    • local struct_time time/utc struct_time timetime.asctime(struct_time)
    • 对于local struct_time time/utc struct_time time:你也可以使用time.strftime(format_str,struct_time) 来自定义格式化串。其中format_str为格式化串。

    字符串转换为struct_timetime.strptime(time_str,format_str)。其中format_str为格式化串。 详解Pandas用法_02_第48张图片

  5. 查看当前时区: time.timezone。它返回的是距离UTC时间的距离(单位为秒)(>0,在美洲;<=0,在大多数欧洲,亚洲,非洲)。你无法通过修改它的值来修改时区。time模块使用的是系统的时区。 time_timezone

1.3 datetime 模块

  1. datetime模块中主要包含四个类:

    • datetime.time:时间类。只包含时、分、秒、微秒等时间信息
    • datetime.date:日期类。值包含年月日星期等日期信息
    • datetime.datetime:日期时间类。包含上述两者的全部信息
    • datetime.timedelta:日期时间间隔类,用来表示两个datetime之间的差值。
  2. datetime.time的构造函数为:

     

     

     
      time([hour[, minute[, second[, microsecond[, tzinfo]]]]])

    其中tzinfo就是时区对象。0<=hour<240<=minute<600<=second<600<=microsecond<1000000,否则抛出异常。tzinfo默认为None

属性有:

  • hour/minute/second/microsecond/tzinfo

方法有:

  • time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]]):替换对应的值,返回一个新的对象
  • time.isoformat():返回一个ISO 8601格式的字符串。
  • time.strftime(format):格式化datetime.time对象
  • time.tzname():如果时区为为None,则返回None。否则返回时区名称

详解Pandas用法_02_第49张图片

  1. datetime.date的构造函数为:

     

     

     
      datetime.date(year, month, day) 
    • month取值为[1,12]day取值为[1,num]num取决于指定的年和月有多少天

    类方法有:date.today()/date.fromtimestamp(timestamp)

    属性有:year/month/day

    方法有:

    • 运算:date1-date2date1+timedeltadate1-timedeltadate1
    • date.replace(year,month,day):替换掉对应值,返回新对象
    • date.timetuple():返回一个time.struct_time类型的元组
    • date.weekday():返回代表星期几的数字。0为周日
    • date.isoweekday():返回代表星期几的数字。7为周日
    • date.isocalendar():返回一个元组(ISO year,IOS week num,ISO weekday)
    • date.isoformat():返回一个ISO 8601格式的字符串。
    • date.ctime():等价于time.ctime(time.mktime(d.timetuple()))
    • date.strftime(format):格式化datetime.date对象

    详解Pandas用法_02_第50张图片

  2. datetime.datetime的构造函数为:

     

     

     
      datetime.datetime(year, month, day, hour=0, minute=0, 
      second=0, microsecond=0, tzinfo=None)

    类方法有:

    • datetime.today():返回当前的时间日期
    • datetime.now(tz=None):返回指定时区当前的时间日期。如果tz=None,则等价于datetime.today()
    • datetime.utcnow():返回当前的UTC时间日期
    • datetime.fromtimestamp(timestamp, tz=None):根据时间戳,创建指定时区下的时间日期。
    • datetime.utcfromtimestamp(timestamp):根据时间戳,创建UTC下的时间日期。
    • datetime.combine(date, time):从datetime对象中创建datetime
    • datetime.strptime(date_string, format):从字符串中创建datetime

    属性有:year/month/day/hour/minute/second/microsecond/tzinfo

    方法有:

    • 运算:datetime1-datetime2datetime1+timedeltadatetime1-timedeltadatetime1
    • datetime.date():返回一个date对象
    • datetime.time():返回一个time对象(该timetzinfo=None
    • datetime.timetz():返回一个time对象(该timetzinfodatetimetzinfo
    • datetime.replace([year[, month[, day[, hour[, minute[, second [, microsecond[, tzinfo]]]]]]]]):替换掉指定值,返回新对象
    • datetime.astimezone(tz=None) :调整时区。如果tz=None,则默认采用系统时区。注意,调整前后的UTC时间是相同的。
    • datetime.tzname():返回时区名字
    • datetime.timetuple():返回一个time.struct_time这样的命名元组
    • datetime.utctimetuple():返回一个time.struct_time这样的命名元组,注意它是在UTC时间下的,而不是local time下的
    • datetime.timestamp():返回一个时间戳
    • datetime.weekday():返回代表星期几的数字。0为周日
    • datetime.isoweekday():返回代表星期几的数字。7为周日
    • datetime.isocalendar():返回一个元组(ISO year,IOS week num,ISO weekday)
    • datetime.isoformat(sep='T'):返回一个ISO 8601格式的字符串。
    • datetime.ctime():等价于time.ctime(time.mktime(d.timetuple()))
    • datetime.strftime(format):格式化datetime.datetime对象。

    注意:不能将tzinfo=Nonetzinfo!=None的两个datetime进行运算。

  3. 下面是常用的格式化字符串的定义:

    • '%Y':4位数的年
    • '%y':2位数的年
    • '%m':2位数的月 [01,12]
    • '%d':2位数的日 [01,31]
    • '%H':小时(24小时制)[00,23]
    • '%I':小时(12小时制)[01,12]
    • '%M':2位数的分[00,59]
    • '%S':秒[00,61]61秒用于闰秒
    • '%w':用整数表示的星期几[0,6],0 表示星期日
    • '%U':每年的第几周[00,53]。星期天表示每周的第一天。每年的第一个星期天之前的那几天被认为是第 0 周
    • '%W':每年的第几周[00,53]。星期一表示每周的第一天。每年的第一个星期一之前的那几天被认为是第 0 周
    • '%z':以+HHMM或者-HHMM表示的UTC时区偏移量。如果未指定时区,则返回空字符串。
    • '%F':以%Y-%m-%d简写的形式
    • '%D':以%m/%d/%y简写的形式
    • '%a':星期几的简称
    • '%A':星期几的全称
    • '%b':月份的简称
    • '%B':月份的全称
    • '%c':完整的日期和时间
    • '%q':季度[01,04]

    详解Pandas用法_02_第51张图片

  4. timedelta代表一段时间。其构造:

     

     

     
      datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0,
      minutes=0, hours=0, weeks=0) 

    在内部,只存储秒、微秒。其他时间单位都转换为秒和微秒。

实例属性(只读):

  • days/seconds/microseconds

实例方法:

  • timedelta.total_seconds():返回总秒数。

详解Pandas用法_02_第52张图片

2. 时间点 Timestamp

  1. 时间点:Timestamp对象从Pythondatetime类继承,它表示时间轴上的一个点。

     

     

     
      pd.Timestamp(ts_input=, freq=None, tz=None,  
      unit=None, year=None, month=None, day=None, hour=None, minute=None, 
      second=None, microsecond=None, tzinfo=None, offset=None)

    参数:

    • ts_input:一个datetime-like/str/int/float,该值将被转换成Timestamp
    • freq:一个字符串或者DateOffset,给出了偏移量
    • tz:一个字符串或者pytz.timezone对象,给出了时区
    • unit:一个字符串。当ts_input为整数或者浮点数时,给出了转换单位
    • offset:废弃的,推荐使用freq
    • 其他的参数来自于datetime.datetime。它们要么使用位置参数,要么使用关键字参数,但是不能混用

    详解Pandas用法_02_第53张图片

    属性有:

    • year/month/day/hour/minute/second/microsecond/nanosecond,这些属性都为整数
    • tzinfo:时区信息(默认为None),它是一个datetime.tzinfo对象
    • dayofweek/dayofyear/days_in_mounth/freqstr/quarter/weekofyear/...
    • value:保存的是UTC时间戳(自UNIX纪元1970年1月1日以来的纳秒数),该值在时区转换过程中保持不变

    Timestamp_property

    类方法有:

    • combine(date, time):通过datetime.datedatetime.time创建一个Timestamp
    • fromtimestamp(ts):通过时间戳创建一个Timestamp
    • now(tz=None):创建一个指定时区的当前时间。
    • doday(tz=None):创建一个指定时区的当前时间。
    • utcfromtimestamp(ts):从时间戳创建一个UTC Timestamp,其tzinfo=None
    • utcnow():创建一个当前的UTC Timestamp,其tzinfo=UTC

    详解Pandas用法_02_第54张图片

    方法有:

    • .astimezone(tz)/.tz_convert(tz):将一个tz-aware Timestamp转换时区
    • .isoformat(sep='T'):返回一个ISO 8601格式的字符串。
    • .normalize():将Timestamp调整到午夜(保留tzinfo
    • replace(**kwds):调整对应值,返回一个新对象
    • .to_period(self, freq=None):返回一个Period对象`
    • .tz_localize(self, tz, ambiguous='raise', errors='raise'):将一个tz-naive Timestamp ,利用tz转换为一个tz-aware Timestamp
    • .to_pydatetime(...):转换为python datetime对象
    • .to_datetime64(...):转换为numpy.datetime64对象
    • datetime.date/datetime.datetime继承而来的方法

    详解Pandas用法_02_第55张图片 详解Pandas用法_02_第56张图片

    默认情况下,pands中的Timestamptz-naive,即tz字段为None。 Timestamp提供了方便的时区转换功能。如果tz非空,则是tz-aware Timestamp。不同时区的时间可以比较,但是naive Timestamplocalized Timestamp无法比较。

    Timestamp的减法,要求两个Timestamp要么都是同一个时区下,要么都是tz-naive的。

  2. DateOffset对象:是一个表示日期偏移对象。Timestamp加一个日期偏移,结果还是一个Timestamp对象。其声明为:

     

     

     
      pd.DateOffset(n=1, normalize=False, **kwds)

    通常我们使用的是其子类(它们位于pandas.tseries.offsets中):

    • Day:日历日
    • BusinessDay:工作日
    • Hour:小时
    • Minute:分钟
    • Second:秒
    • Milli:毫秒
    • Micro:微秒
    • MonthEnd:每月最后一个日历日
    • BusinessMonthEnd:每月最后一个工作日
    • MonthBegin:每月第一个日历日
    • BusinessMonthBegin:每月第一个工作日
    • Week:每周几

    Day(2):表示两个工作日。

    DateOffset对象可以加在datetime/Timestamp对象上。如果是MonthEnd这种加上Timestamp,则第一次增量会将原日期向前滚动到符合频率规则的下一个日期。

    • 你可以通过DateOffset.rollforward(time_stamp)DateOffset.rollback(time_stamp)来显式地将日期向前或者向后滚动

    DateOffset

  3. 利用 str(dt_obj)函数或者datetime.strftime(format_str)方法,可以将datetime对象和Timestamp对象格式化为字符串。而利用datetime.strptime(dt_str,format_str)类方法,可以从字符串中创建日期。其中dt_str为日期字符串,如'2011-11-12'format_str为格式化字符串,如'%Y-%m-%d'

    • datetime.strptime是对已知格式进行日期解析的最佳方式。
    • 对于一些常见的日期格式,使用dateutil这个第三方包中的parser.parse(dt_str),它几乎可以解析所有的日期表示形式。
    • pandas.to_datetime()方法可以解析多种不同的日期表示形式,将字符串转换为日期。对于标准日期格式的解析非常快。如果发现无法解析(如不是一个日期),则返回一个NaTNot a Time),它是时间戳数据中的NA值。
  4. Timedelta对象:表示时间间隔。它等价于datetime.timedelta类。

     

     

     
      pd.Timedelta(value=, unit=None, **kwargs) 

    参数:

    • value:一个Timedelta对象,或者datetime.timedelta,或者np.timedelta64、或者一个整数,或者一个字符串。指定了时间间隔
    • unit:一个字符串,指明了当输入时整数时,其单位。可以为'D'/'h'/'m'/'s'/'ms'/'us'/'ns'
    • days/seconds/microseconds/nanoseconds:都是数值。给出了某个时间单位下的时间间隔

    方法:

    • to_timedelta64():返回一个numpy.timedelta64类型(按照纳秒的精度)
    • total_seconds():返回总的时间间隔,单位秒(精度为纳秒)
    • to_pytimedelta():返回一个datetime.timedelta对象

    属性:

    • components:返回各成分的命名元组
    • days/seconds/microseconds/nanoseconds:返回各个成分
    • delta:返回总的时常(纳秒计)

    一个时间间隔有天数、秒数等等属性。注意:所有的这些值与对应的单位相乘的和,才是总的时间间隔。

    两个Timestamp相减可以得到时间间隔Timedelta

    DateOffset也一定程度上表示时间间隔,但是DateOffset更侧重于按照某个固定的频率的间隔,比如一天、一个月、一周等。

    详解Pandas用法_02_第57张图片

    3. 时间段 Period

    1. Period表示一个标准的时间段(如某年,某月)。时间段的长短由freq属性决定。

       

       

       
        pd.Period(value=None, freq=None, ordinal=None, year=None, month=None, 
        quarter=None, day=None, hour=None, minute=None, second=None)

      参数:

      • value:一个Period对象或者字符串(如'4Q2016'),它表示一个时区段。默认为None
      • freq:一个字符串,表示区间长度。可选的值从下面函数获取:
      • pandas.tseries.frequencies._period_code_map.keys()
      • pandas.tseries.frequencies._period_alias_dictionary()
      • 其他的参数和前面的其他类的构造函数类似。其中quarter表示季度。

      属性:

      • day/dayofweek/dayofyear/hour/minute/quarter/second/ year/week/weekday/weekofyear/year:对应的属性
      • end_time:区间结束的Timestampstart_time:区间开始的Timestamp
      • freq

      方法:

      • .asfreq(freq,how):转换为其他区间。其中freq为字符串。how可以为'E'/'end',表示包含区间结束;'S'/'start'表示包含区间开始。
      • .now(freq):返回当期日期对应freq下的Period
      • strftime(format):给出Period的格式化字符串表示
      • to_timestamp(freq,how):转换为Timestamp

      详解Pandas用法_02_第58张图片

    2. pands中的频率是由一个基础频率和一个倍数组成。

      • 基础频率通常以一个字符串别名表示,如'M'表示每月,'H'表示每小时。
      • 对于每个基础频率,都有一个DateOffset对象与之对应。如pandas.tseries.offsets中的Hour/MinuteHour(4)表示日期偏移为 4小时。
      • 倍数为基础频率之前的数字,如'4H'。也可以组合多个频率4H30min

      有些频率描述的时间点并不是均匀间隔的。如'M'就取决于每个月的天数。下面是一些常用的基础频率

      • 'D':偏移量类型为Day,为每日历日
      • 'B':偏移量类型为BusinessDay,为每工作日
      • 'H':偏移量类型为Hour,为每小时
      • 'T'或者'min':偏移量类型为Minute,为每分钟
      • 'S':偏移量类型为Second,为每秒
      • 'L'或者'ms':偏移量类型为Milli,为每毫秒
      • 'U':偏移量类型为Micro,为每微秒
      • 'M':偏移量类型为MonthEnd,为每月最后一个日历日
      • 'BM':偏移量类型为BusinessMonthEnd,为每月最后一个工作日
      • 'MS':偏移量类型为MonthBegin,为每月第一个日历日
      • 'BMS':偏移量类型为BusinessMonthBegin,为每月第一个工作日
      • 'W-Mon'...'W-TUE:偏移量类型为Week,为指定星期几(MON/TUE/WED/THU/FRI/SAT/SUN)开始算起,每周
    3. 调用Timestamp对象的.to_period(freq)方法能将时间点转化为包含该时间点的时间段。 详解Pandas用法_02_第59张图片

    4. Period.asfreq()方法可以实现时间段的频率转换。 详解Pandas用法_02_第60张图片

      创建Period时,我们可以传入一个Timestamp的各分量(由year/month...等提供)。创建的Period是包含该时刻,且指定频率。在使用Timestamp.to_period(freq)也是如此。

      给定一个频率的Period,如果转换到更低频的Period,则非常简单:返回指定频率下的包含本Period的那个Period即可。如果想转换到更高频的Period,则由于在本Period下,对应了很多个高频的Period,则返回哪一个,由how参数指定:

      • how=S:返回最开头的那个Period
      • how=E:返回最末尾的那个Period

      Period.to_timestamp(freq,how)方法中,我们首先进行时间段的频率转换,然后提取该频率的Period开始处的Timestamp

      详解Pandas用法_02_第61张图片

    5. 如果两个Period对象有相同的频率,则它们的差就是它们之间的单位数量。

    4. DatetimeIndex

    1. DatetimeIndex是一种索引,它的各个标量值是Timestamp对象,它用numpydatetime64数据类型以纳秒形式存储时间戳。

       

       

       
        pd.DatetimeIndex(data=None, freq=None, start=None, end=None, periods=None,
        copy=False, name=None, tz=None, verify_integrity=True, normalize=False,
        closed=None, ambiguous='raise', dtype=None, **kwargs)
      • data:一个array-like对象,给出了各个时间
      • copy:一个布尔值,如果为True 则拷贝基础数据
      • freq:一个字符串或者DateOffset对象,给出了频率
      • start:一个datetime-like,指定了起始时间。如果data=None,则使用它来生成时间
      • periods:一个整数(大于0),指定生成多少个时间。如果data=None,则使用它来生成时间
      • end:一个datetime-like,指定了结束时间。如果data=Noneperiods=None,则使用它来生成时间
      • closed:一个字符串或者None。用于指示区间的类型。可以为'left'(左闭右开),'right'(左开右闭),None(左闭右闭)
      • tz: 一个字符串,指定了时区。如果非空,则返回的是localized DatetimeIndex
      • name:指定了Index的名字

      详解Pandas用法_02_第62张图片

    2. pandas.date_range()函数可以生成指定长度的DatetimeIndex

       

       

       
        pandas.date_range(start=None, end=None, periods=None, freq='D', tz=None, 
        normalize=False,name=None, closed=None, **kwargs)

      各参数意义参考DatetimeIndex的构造函数。

    3. 对于以DatetimeIndex为索引的Series,我们可以通过指定Timestamp切片来截取指定时间区间的数据(也可以是对应的字符串来指定Timestamp)。注意:这里的Timestamp可以并不是DatetimeIndexkey

      详解Pandas用法_02_第63张图片 详解Pandas用法_02_第64张图片

    4. DatetimeIndex的方法有:(DatetimeIndex继承自Index,因此它有Index的所有方法)

      • indexer_at_time(time, asof=False):返回指定time的位置
      • indexer_between_time( start_time, end_time, include_start=True, include_end=True):返回指定的两个时间之间的索引的位置
      • normalize():将时间调整到午夜
      • to_period( freq=None):以指定freq转换到PeriodIndex
      • to_perioddelta( freq):计算不同索引值的Timedelta,然后转换成一个TimedeldaIndex
      • to_pydatetime/tz_convert/tz_localize:对每个时间使用Timestamp对应的方法

      任何Timestamp的属性都可以作用于DatetimeIndex。 详解Pandas用法_02_第65张图片

    5. PeriodIndex

    1. 如果将一个Period序列作为索引,则该索引就是PeriodIndex类型。其各位置的值为Period对象。

       

       

       
        pd.PeriodIndex(data=None, ordinal=None, freq=None, start=None, end=None,
        periods=None, copy=False, name=None, tz=None, dtype=None, **kwargs)
      • data:一个array-like对象,给出了各个时间段
      • copy:一个布尔值,如果为True 则拷贝基础数据
      • freq:一个字符串或者period对象,给出了频率
      • start:一个period-like,指定了起始时间段。如果data=None,则使用它来生成时间段
      • periods:一个整数(大于0),指定生成多少个时间段。如果data=None,则使用它来生成时间段
      • end:一个period-like,指定了结束时间段。如果data=Noneperiods=None,则使用它来生成时间段
      • year/month/quarter/day/hour/minute/second:一个整数、array或者Series 。通过它们可以组装出一个Period序列。
      • tz: 一个字符串,指定了时区。如果非空,则返回的是localized DatetimeIndex
      • name:指定了Index的名字

      详解Pandas用法_02_第66张图片

    2. pandas.period_range()函数可以生成指定长度的PeriodIndex

       

       

       
        pd.period_range(start=None, end=None, periods=None, freq='D', name=None)

      参数意义参见PeriodIndex的构造函数。

    3. PeriodIndex的方法有:(PeriodIndex继承自Index,因此它有Index的所有方法)

      • asfreq( freq=None, how='E'):转换成另一种频率的时间段
      • to_timestamp(self, freq=None, how='start'):转成DatetimeIndex
      • tz_convert(self, tz)/tz_localize(self, tz, infer_dst=False):转成对应时区的DatetimeIndex

      任何Period的属性都可以作用于PeriodIndex。 详解Pandas用法_02_第67张图片

    6. resample 和频率转换

    1. Series/DataFrame有一个shift()方法用于执行单纯的前移或者后移操作,:

       

       

       
        Series/DataFrame.shift(periods=1, freq=None, axis=0) 
      • periods:一个整数(可以为负的),指定移动的数量。对于时间序列,单位由freq指定。
      • freq:一个DateOffset/timedelta或者一个频率字符串。指定移动的单位。注意,如果为PeriodIndex,则freq必须和它匹配。
      • axis:为0/'index'表示沿着0轴移动;为1/'columns'表示沿着1轴移动

      如果为时间序列,则该方法移动并建立一个新的索引,但是Series/DataFrame的值不变。对于非时间序列,则保持索引不变,而移动Series/DataFrame的值。

      本质上,时间序列和非时间序列都是index_i-->value_i转换成index_i+n-->value_i。只是时间序列截取的都是有效值,非时间序列截取了NaN而已。

      详解Pandas用法_02_第68张图片 详解Pandas用法_02_第69张图片详解Pandas用法_02_第70张图片

    2. 重采样resampling指的是将时间序列从一个频率转换到另一个频率的处理过程。

      • 将高频数据转换到低频数据称作降采样。降采样时,待聚合的数据不必拥有固定的频率,期望的频率(低频的)会自动划分聚合的bin的边界。这些bin将时间序列拆分为多个片段。这些片段都是半开放的,一个数据点只能属于一个片段,所有的片段的并集组成了整个时间帧。在对数据降采样时,只需要考虑两样:
      • 各个区间哪边是闭合的
      • 如何标记各个聚合bin,用区间的开头还是结尾
      • 将低频数据转换到高频数据称作升采样。将数据转换到高频时,就不需要聚合了,而是插值,默认引入缺失值。插值的填充和填充方式与fillna/reindex的一样。
      • 在对时间段Period进行重采样时,升采样稍微麻烦点,因为你必须决定:哪个高频区间代表原区间。就像asfreq一样,convention可以设置为'end'/'start'

      有些重采样并不划分到上述两者之中。比如将W-WED(每周三)转换到W-FRI(每周五)。另外,由于Period是时间区间,所以升采样和降采样的规则就比较严格:

      • 降采样中,目标频率必须包含原频率。如Day->Month,目标频率为每月,原频率为每天。
      • 升采样中,原频率必须包含目标频率。如Day->Hour,目标频率为每小时,原频率为每天。

      如果不满足这些条件,则会引发异常。

    3. resample 方法:

       

       

       
        Series/DataFrame.resample(rule, how=None, axis=0, fill_method=None, closed=None, 
        label=None, convention='start', kind=None, loffset=None, limit=None, 
        base=0, on=None, level=None)
      • rule:一个字符串,指定了重采样的目标频率

      • axis:为0/'index'表示沿着0轴重采样;为1/'columns'表示沿着1轴重采样

      • closed:一个字符串,指定降采样中,各时间段的哪一端是闭合的。如果为'right',则是左开右闭区间;如果为'left',则是左闭右开区间

      • label:在降采样中,如何设置聚合值的标签。可以为'right'/'left'(面元的右边界或者左边界)。如:9:30~9:35这5分钟会被标记为9:30或者9:35

      • how:用于产生聚合值的函数名或者数组函数。可以为'mean'/'ohlc'/np.max等。默认为'mean',其他常用的有:'first'/'last'/'median'/'ohlc'/'max'/'min'

        how被废弃了,而是采用.resample().mean()这种方案。

      • convention:当重采样时期时,将低频转换到高频所采用的约定。可以为's'/'start'(用第一个高频)或者'e'/'end'(用最后一个高频)

      • loffset:一个timedelta,用于调整面元(bin)标签。如'-1s',会将用于将聚合的结果标签调早1秒,从而更容易表示它代表哪个区间。比如12:00:00你就难以判别是哪个区间,而11:59:59就很容易知道它是那个区间。

        你也可以对调用结果对象使用.shift()方法来实现该目的,这样就不必设置loffset

      • base:一个整数,默认为0.用于聚合过程中,当频率可以整除1D(比如4H)时,第一个完整的分组从哪个元素开始的。如rule='4H'base=2,则Series[0:1]作为一个分组,Series[2:6]....作为一个分组....

      • on:一个字符串,对于DataFrame,它指定了重采样的列。该列必须是datetime-like

      • level:一个字符串或者整数。对于MultiIndex,该参数指定了被重采样的子索引

      • fill_method:一个字符串,指定升采样时,如何插值。如'ffill'/'bfill'。默认不插值

        该参数被废弃。推荐使用.resample().ffill()这种方案。而limit作为ffill()的参数。

      • limit:一个整数。指定向前或者向后填充时,运行连续填充的最大单元数量

      • kind:一个字符串,指定聚合到时间段Period还是时间戳Timestamp。默认聚合到时间序列的索引类型

      详解Pandas用法_02_第71张图片详解Pandas用法_02_第72张图片详解Pandas用法_02_第73张图片 详解Pandas用法_02_第74张图片 详解Pandas用法_02_第75张图片

    4. OHLC重采样是计算bin中的四个值:开盘值(第一个值)、收盘值(最后一个值)、最高值(最大值)、最低值(最小值)

    5. 另一种降采样的办法是:使用groupby功能。如:

       

       

       
        series.groupby(lambda x:x.month).mean()

      如果你想根据年份来聚合,则使用x.year

    详解Pandas用法_02_第76张图片

    十、 DataFrame 绘图

    1. matplotlib是一种比较低级的工具,pandas中有许多利用DataFrame对象数据组织特点来创建标准图表的高级绘图方法。

    2. Series/DataFrame.plot():绘制图形。

       

       

       
        Series.plot(kind='line', ax=None, figsize=None, use_index=True, title=None, grid=None,
        legend=False, style=None, logx=False, logy=False,loglog=False,xticks=None,yticks=None,
        xlim=None, ylim=None, rot=None, fontsize=None, colormap=None, table=False, yerr=None, 
        xerr=None, label=None, secondary_y=False, **kwds)
        DataFrame.plot(x=None, y=None, kind='line', ax=None, subplots=False, sharex=None, 
        sharey=False, layout=None, figsize=None, use_index=True, title=None, grid=None, 
        legend=True, style=None, logx=False, logy=False, loglog=False, xticks=None, 
        yticks=None, xlim=None, ylim=None, rot=None, fontsize=None, colormap=None,
        table=False, yerr=None, xerr=None, secondary_y=False, sort_columns=False, **kwds)
      • kind:绘制的类型。可以为:'line''bar''barh'(水平的bar)、'hist''box''kde'(核密度估计)、'density'(类似kde)、'area''pie'
      • ax:一个Axes实例对象。如果为空,则是plt.gca()的返回值(当前Axes
      • figsize:一个元组,指定图片大小(单位为英寸)
      • use_index:一个布尔值。如果为True,则使用index作为X轴。
      • title:图形的标题
      • grid:一个布尔值。如果为True,则开启网格
      • legend:一个布尔值,如果为True,则放置图例
      • style:一个列表或者字典,给出了每一列的线型
      • logx:一个布尔值,如果为True,则x轴为对数型
      • logy:一个布尔值,如果为True,则y轴为对数型
      • loglog:一个布尔值,如果为True,则x轴和y轴都为对数型
      • xticks:一个序列,用于给出xticks
      • yticks:一个序列,用于给出yticks
      • xlim:一个二元的元组或者序列,给出x轴范围
      • ylim:一个二元的元组或者序列,给出y轴范围
      • rot:一个整数,给出了x轴和ytick旋转角度(不是弧度)。
      • fontsize:一个整数,给出了xtick/ytick的字体大小
      • colormap:一个字符串或者colormap对象,给出了colormap
      • colorbar:一个布尔值。如果为True,则绘制colorbar(只用于scatterhexbin图中)
      • position:一个浮点数。给出了bar图中,各bar的对其位置(0表示bar的左侧与它的坐标 对其;1表示bar的右侧与它的坐标对其)
      • layout:一个元组。给出了(rows,columns)
      • table:一个布尔值或者Series/DataFrame。如果为True,则将本Series/DataFrame绘制为一个表格;如果为Series/DataFrame,则将该参数绘制为表格
      • yerr:用于绘制Error Bar
      • xerr:用于绘制Error Bar
      • labelplotlabel参数
      • secondary_y:一个布尔值或者一个整数序列。如果为True,则y轴绘制在右侧
      • mark_right:一个布尔值,如果为Truesecondary_y=True,则在图例中标记为right
      • kwds:传递给matplotlib中的plot函数的其他关键字参数

      DataFrame.plot中,下面的参数意义为:

      • xlabel或者position
      • ylabel或者position
      • subplots:一个布尔值,如果为True,则将每一列作为一个子图来绘制
      • sharex:一个布尔值。如果为True,且subplots=True,则子图共享x
      • sharey:一个布尔值。如果为True,且subplots=True,则子图共享y
      • stacked:一个布尔值。在bar中,如果为True,则将柱状图堆积起来
      • sort_columns:一个布尔值。如果为True,则根据列名来决定绘制的先后顺序。

      它们返回的是AxesSubplot对象,或者AxesSubplotndarray

      详解Pandas用法_02_第77张图片详解Pandas用法_02_第78张图片 详解Pandas用法_02_第79张图片 详解Pandas用法_02_第80张图片 详解Pandas用法_02_第81张图片 详解Pandas用法_02_第82张图片详解Pandas用法_02_第83张图片详解Pandas用法_02_第84张图片 详解Pandas用法_02_第85张图片

    3. 给出一组序列,我们可以手工绘制每个序列的散布图,以及各自的核密度估计。我们可以使用scatter_matrix函数:

       

       

       
        pandas.tools.plotting.scatter_matrix(frame, alpha=0.5, figsize=None, ax=None, 
        grid=False, diagonal='hist', marker='.', density_kwds=None, hist_kwds=None, 
        range_padding=0.05, **kwds)
      • frame:为DataFrame对象
      • diagonal:选择对角线上的图形类型。可以为'hist'/'kde'
      • hist_kwds:绘制hist的参数
      • density_kwds:绘制kde的参数
      • range_padding:一个浮点数,用于延伸x/y轴的范围。如果它为0.1,表示x轴延伸x_max-xmin的0.1倍 每一个子图是这样生成的:以DataFrame中某一列为横坐标,另一列为纵坐标生成的散点图。

      详解Pandas用法_02_第86张图片

    十二、 数据加载和保存

    1. 文本文件

    1. read_csv可以读取文本文件(.csv 格式):

        pandas.read_csv(filepath_or_buffer, sep=', ', delimiter=None, header='infer',
        names=None, index_col=None, usecols=None, squeeze=False, prefix=None, 
        mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None,
        false_values=None, skipinitialspace=False,skiprows=None, nrows=None,na_values=None,
        keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, 
        parse_dates=False, infer_datetime_format=False,keep_date_col=False,date_parser=None,
        dayfirst=False, iterator=False, chunksize=None, compression='infer', thousands=None, 
        decimal='.', lineterminator=None, quotechar='"', quoting=0, escapechar=None,
        comment=None, encoding=None, dialect=None, tupleize_cols=False, 
        error_bad_lines=True, warn_bad_lines=True, skipfooter=0, skip_footer=0, 
        doublequote=True, delim_whitespace=False, as_recarray=False,
        compact_ints=False, use_unsigned=False, low_memory=True, 
        buffer_lines=None, memory_map=False, float_precision=None)
      • filepath_or_buffer:一个字符串,或者一个pathlib.Path对象,或者任何拥有.read()方法的对象。它指定了被解析的文件的位置。如果是个字符串,则必须是个URL(其中包含了协议名,如http//,ftp//,file//等)

      • sep:一个字符串,指定了分隔符。默认为','。如果设定为None,则自动决议分隔符。

        • 如果字符串长度大于1,则自动解析为正则表达式。如'\s+\解析为空白符
      • delimiter:一个字符串,指定了分隔符。它是sep参数的另一个候选参数

      • delim_whitespace:一个布尔值。如果为True,则将空白符(连续的空白或者单个空白)作为分隔符。此时不需要提供delimiter参数。它等价于sep='\s+'

      • header:一个整数或者整数列表。它指定了那些行是标题行,0表示第一行。如果你指定了header=[1,3,5],则第三行(行id=2)和第五行(行id=4)被忽略(不被解析)。

        • 如果names参数为空,则header默认值为 0.如果names参数提供了,则header默认值为None
    - 该参数会忽略注释行。
    - 如果`skip_blank_lines=True`,则该参数会忽略空白行。因此`header=0`表示第一个有效的数据行
    
    • names:一个array-like。它给出了列名。

      • 如果文件不包含标题行,则你需要显式通过names传入列名
      • 如果mangle_dupe_cols=True,则可以传入重复的列名。否则不允许重复列名
    • index_col:一个整数,或者序列,或者False。它指定哪一列作为row labels。如果你指定了一个序列,则使用MultiIndex。如果为False,则不采用任何列作为row labels

    • usecols:一个array-like。它指定:你将采用哪些列来组装DataFrame。该参数各元素必须要么是代表位置的整数,要么是代表列名的字符串

    • as_recarray:一个布尔值。被废弃的参数。

    • squeeze:一个布尔值。如果为True,则当解析结果只有一列数据时,返回一个Series而不是DataFrame

    • prefix:一个字符串。当没有标题时,你可以提供这个参数来给列名加一个前缀。(如果不加前缀,则列名就是0,1,2...

    • mangle_dupe_cols:一个布尔值。如果为True,则重复的列名X,X...被修改为X.0,X.1,...。如果为False,则重复的列名这样处理:后面的覆盖前面的

    • dtype:一个Type name或者字典:column->type。它可以给出每个列的类型。

    • engine:一个字符串,指定用什么解析引擎。可以为'c'/'python'c更快,但是python拥有更多特性

    • converters:一个字典,给出了每一列的转换函数。字典的键为代表列的位置的整数,或者代表列的名字的字符串。字典的值为可调用对象,参数为一个标量(就是每个元素值)

    • true_values:一个列表,给出了哪些值被认为是True

    • false_values:一个列表,给出了哪些值被认为是False

    • skipinitialspace:一个布尔值。如果为True,则跳过分隔符之后的空白符

    • skiprows:一个array-like或者整数。如果为序列,则指定跳过哪些行(从0计数);如果为整数,则指定跳过文件开头的多少行。注意:空行和注释行也包括在内,这一点和header不同。

    • skipfooter:一个整数。指定跳过文件结尾的多少行。不支持engine='c'

    • skip_footer:被废弃的参数

    • nrows:一个整数。指定读取多少行。

    • na_values:一个标量、字符串、字典、列表。指定哪些被识别为NAN。默认的NAN为列表['nan','NAN','NULL'....]

    • keep_default_na:一个布尔值。如果为True,则当你指定了na_values时,默认的NAN被追加到na_values上;否则指定的na_values代替了默认的NAN

    • na_filter:一个布尔值。如果为True,则不检查NaN,此时解析速度大大加快(但是要求你的数据确实没有NAN

    • verbose:一个布尔值。如果为True,输出解析日志

    • skip_blank_lines:一个布尔值。如果为True,则跳过空白行,而不是解析为NaN

    • parse_dates:一个布尔值、整数列表、标签列表、或者list of list or dict。对于iso8601格式的日期字符串,解析速度很快。

      • 如果为布尔值:如果为True,则解析index为日期
      • 如果为整数列表或者标签列表,则解析对应的列为日期
      • 如果列表的列表,如[[1,3]],则将列1和列3组合在一起,解析成一个单独的日期列
      • 如果为字典,如{'aaa':[1,3]},则将列1和列3组合在一起,解析成一个单独的日期列,日期列的名字为'aaa'
    • infer_datetime_format:一个布尔值。如果为True,且parse_dates非空,则pandas试图从数据中推断日期格式。

    • keep_date_col:一个布尔值。如果为True,并且parse_dates使用多个列合成一列日期,则保留原有的列

    • date_parser:一个函数对象。它将一列字符串转换成一列日期。

    • dayfirse:一个字符串。如果为True,则日期格式为DD/MM

    • iterator:一个布尔值。如果为True,则返回一个TextFileReader对象,该对象可以用于迭代或者.get_chunk()来返回数据块

    • chunksize:一个整数。指定TextFileReader对象.get_chunk()返回的数据块的大小。

    • compression:一个字符串。可以为'infer','gzip','bz2','zip','xz',None。如果文件为压缩文件,则它用于指定解压格式

    • thousands:一个字符串。指定了数值中千位数的分隔符,如999,999,999

    • decimal:一个字符串,指定了小数点的分隔符,如9.999

    • float_precision:一个字符串。指定了C engine的转换浮点数的精度。None普通转换,'high'为高精度转换,'round_trip'round_trip转换。

    • lineterminator:一个长度为1的字符串。指定了C engine中的换行符

    • quotechar:一个长度为1的字符串,它指定了引用字符。比如"aaa,bbb",这种数据是引用数据。如果你用,分隔,则有问题。在引用字符包围的数据中,不考虑分隔符。

    • comment:一个长度为1的字符串,指定了注释字符。如果该字符串出现在行中,则行末的字符不被解析。如果该字符串出现在行首,则本行不被就解析。

    • encoding:一个字符串,指定了编码类型

    • error_bad_lines:一个布尔值。如果为True,则如果某一行有太多字段,则函数抛出异常。如果为False,则抛弃该行,顺利解析。只用于C engine

    • warn_bad_lines:一个布尔值。如果为True,且error_bad_lines=False,则对于异常的行,输出警告

    • buffer_lines/compact_ints /use_unsigned:被废弃的参数

    • memory_map:如果为True,且filepath是一个文件名,则使用内存映射,将文件映射到内存中。

    详解Pandas用法_02_第87张图片详解Pandas用法_02_第88张图片

    1. read_table也能完成read_csv的功能。二者接口一致。

       

       

       
        pandas.read_table(filepath_or_buffer, sep='\t', delimiter=None, header='infer', 
        names=None, index_col=None, usecols=None, squeeze=False, prefix=None, 
        mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None,
        false_values=None, skipinitialspace=False,skiprows=None, nrows=None, na_values=None,
        keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True,
        parse_dates=False,infer_datetime_format=False,keep_date_col=False, date_parser=None,
        dayfirst=False, iterator=False, chunksize=None, compression='infer', thousands=None,
        decimal='.', lineterminator=None, quotechar='"', quoting=0, escapechar=None,
        comment=None, encoding=None, dialect=None, tupleize_cols=False, 
        error_bad_lines=True, warn_bad_lines=True, skipfooter=0, skip_footer=0,
        doublequote=True, delim_whitespace=False, as_recarray=False,
        compact_ints=False, use_unsigned=False, low_memory=True,
        buffer_lines=None, memory_map=False, float_precision=None) 
    2. DataFrame/Series.to_csv方法可以将数据写入到文件中

       

       

       
        DataFrame.to_csv(path_or_buf=None, sep=', ', na_rep='', float_format=None,
        columns=None, header=True, index=True, index_label=None, mode='w', 
        encoding=None, compression=None, quoting=None, quotechar='"',
        line_terminator='\n', chunksize=None, tupleize_cols=False, date_format=None, 
        doublequote=True, escapechar=None, decimal='.')
        Series.to_csv(path=None, index=True, sep=', ', na_rep='', float_format=None, 
        header=False, index_label=None, mode='w', encoding=None, date_format=None, 
        decimal='.')
      • path_or_buf:一个字符串或者file对象。指定写入的文件。如果为空,则返回一个字符串而不是写入文件
      • sep:一个字符串,指定字段的分隔符
      • na_rep:一个字符串,指定NaN的代表字符串
      • float_format:一个字符串,指定了浮点数的格式化字符串
      • columns:一个序列,指定要写入哪些列
      • header:一个布尔值或者字符串列表。如果为True,则写出列名。如果为字符串列表,则它直接指定了列名的别名
      • index:一个布尔值。如果为True,则输出index label
      • mode:一个字符串,文件操作的读写模式。默认为'w'
      • encoding:一个字符串,指定编码方式
      • compression:一个字符串,指定压缩格式
      • line_terminator:一个字符串,指定换行符
      • chunksize:一个整数,指定了一次写入多少行
      • date_format:一个字符串,给出了日期格式化字符串
      • decimal:一个字符串,给出了小数点的格式
      • tupleize_cols:一个布尔值。如果为True,则MultiIndex被写成list of tuples

      详解Pandas用法_02_第89张图片

    2. Json

    1. read_json能够读取Json文件:

       

       

       
        pandas.read_json(path_or_buf=None, orient=None, typ='frame', dtype=True, 
        convert_axes=True, convert_dates=True, keep_default_dates=True, numpy=False,
        precise_float=False, date_unit=None, encoding=None, lines=False)
      • path_or_buf:一个字符串或者一个file-like对象。如果是个字符串,则必须是个URL(其中包含了协议名,如http//,ftp//,file//等)
      • orient:一个字符串,指定了期望的JSON格式。可选的格式有(参考to_json的实例):
      • 'split'JSON是个类似字典的格式:{index -> [index], columns -> [columns], data -> [values]}
      • 'records'JSON 是个类似列表的格式:[{column -> value}, ... , {column -> value}]
      • 'index'JSON是个类似字典的格式{index -> {column -> value}}
      • 'columns'JSON 是个类似字典的格式{column -> {index -> value}}
      • 'values'JSON就是值的序列

      注意:如果type=='series',则允许的'orients= {'split','records','index'},默认为'index',且如果为'index',则要求索引为唯一的。如果type=='frame',则允许上所有的格式,默认为'columns',且如果为'index'/'columns',则要求DataFrame.index为唯一的;如果'index'/'columns'/'records',则要求DataFrame.columns为唯一的

      • typ:一个字符串,指定将JSON转换为Series/DataFrame那一种。可以为'series','frame'
      • dtype:一个布尔值或者字典。如果为True,则自动推断数值类型。如果为False,则不推断类型。如果为字典,则给出了每一列的数值类型
      • convert_axes:一个布尔值,如果为True,则试图转换到合适的数值类型
      • convert_dates:一个布尔值,如果为True,则试图转换日期列为日期。它转换下面这些列名的列:列名以'_at'/'_time'结束、列名以'timestamp'开始、列名为'mofified'/'date'
      • keep_default_dates:一个布尔值。如果为True,则当转换日期列时,保留原列
      • numpy:一个布尔值,如果为True,则直接转换为ndarray
      • precise_float:一个布尔值,如果为True,则使用解析为更高精度的浮点数
      • date_unit:一个字符串。用于转换时间戳到日期。它提供时间戳的单位,如's'/'ms'
      • lines:一个布尔值。如果为True,则读取文件的每一行作为一个JSON -encoding:一个字符串,指定编码方式

      详解Pandas用法_02_第90张图片

    2. pandas对象保存成JSON

       

       

       
        Series/DataFrame.to_json(path_or_buf=None, orient=None, date_format='epoch',
        double_precision=10, force_ascii=True, date_unit='ms', default_handler=None, 
        lines=False)
      • path_or_buf:指定保存的地方。如果为None,则该函数返回一个StringIO对象
      • orient参数:参考read_json()
      • date_format:一个字符串,指定日期转换格式。可以为'epoch'(从1970-1-1日以来的毫秒数)、'iso'
      • double_precision:一个整数,指定了浮点数的精度
      • force_ascii:一个布尔值,如果为True,则将encoded string转换成ASCII
      • date_unit:一个字符串,参考read_json
      • default_handler:一个可调用对象。用于处理当对象无法转换成JSON的情况。它只有一个参数,就是被转换的对象
      • lines:一个布尔值。如果orient='records'时,输出换行符。对其他格式则抛出异常

      详解Pandas用法_02_第91张图片

    3. 二进制文件

    1. pandas.read_pickle(path)可以从pickle文件中读取数据,pathpickle文件的文件名。

      Series/DataFrame.to_pickle(path):将Series/DataFrame保存到pickle文件中,pathpickle文件的文件名。

      read_to_pickle

    4. Excel 文件

    1. read_excel读取Excel文件。需要用到第三方包xlrd/xlwt,前者读excel,后者写excel

       

       

       
        pandas.read_excel(io, sheetname=0, header=0, skiprows=None, skip_footer=0,
        index_col=None, names=None, parse_cols=None, parse_dates=False, date_parser=None,
        na_values=None, thousands=None, convert_float=True, has_index_names=None,
        converters=None, true_values=None, false_values=None, engine=None, 
        squeeze=False, **kwds)
      • io:一个字符串,或者file-like对象。如果是个字符串,则必须是个URL(其中包含了协议名,如http//,ftp//,file//等)
      • sheetname:一个字符串或者整数,或者列表。它指定选取Excel文件中哪个sheet。字符串指定的是sheet名,整数指定的是sheet的位置(0为第一个sheet
      • engine:一个字符串,指定了读写Excel的引擎。可以为:io.excel.xlsx.writerio.excel.xls.writerio.excel.xlsm.writer
      • 其他参数参考read_csv

      详解Pandas用法_02_第92张图片

    2. 保存DataFrameExcel文件:

       

       

       
        DataFrame.to_excel(excel_writer, sheet_name='Sheet1', na_rep='', 
        float_format=None, columns=None, header=True, index=True, index_label=None, 
        startrow=0, startcol=0, engine=None, merge_cells=True, encoding=None, 
        inf_rep='inf', verbose=True)
      • excel_writer:一个字符串(文件名)或者一个ExcelWriter对象
      • sheet_name:一个字符串,指定sheet
      • na_rep:一个字符串,代表NaN
      • startrow/startcol:指定了左上角的单元格的位置
      • engine:一个字符串,指定了读写Excel的引擎。可以为:io.excel.xlsx.writerio.excel.xls.writerio.excel.xlsm.writer
      • merge_cells:一个布尔值。如果为True,则多级索引中,某些索引会合并单元格
      • inf_rep:一个字符串,只代表无穷大。

      详解Pandas用法_02_第93张图片

    5. HTML 表格

    1. read_html可以将HTML中的

      解析为一个DataFrame列表。

       

       

       
        pandas.read_html(io, match='.+', flavor=None, header=None, index_col=None, 
        skiprows=None, attrs=None, parse_dates=False, tupleize_cols=False, 
        thousands=', ', encoding=None, decimal='.', converters=None, 
        na_values=None, keep_default_na=True)
      • io:为一个字符串或者一个file-like对象。
      • match:一个字符串或者正则表达式。HTML中的
        中,只要匹配这个正则表达式的表格都被处理。默认的为匹配任何非空的表格
      • flavor:一个字符串,指定了解析引擎。可以为'bs4'或者'html5lib'或者'lxml'
      • attrs:一个字典。它筛选出你要解析哪些表格
      • 其他参数参考read_csv

      详解Pandas用法_02_第94张图片

    2. 可以通过DataFrame.to_html()转换为HTML的表格:

       

       

       
        DataFrame.to_html(buf=None, columns=None, col_space=None, header=True,
        index=True, na_rep='NaN', formatters=None, float_format=None, 
        sparsify=None, index_names=True, justify=None, bold_rows=True, 
        classes=None, escape=True, max_rows=None, max_cols=None, show_dimensions=False, 
        notebook=False, decimal='.', border=None)
      • bold_rows:一个布尔值。如果为True,则让row label加粗
      • classes:一个字符串或者列表或者元组,给出了tablecss class
      • escape:一个布尔值,如果为True,则将字符<>&为安全的HTML字符
      • max_rows:一个整数,指定最大输出行数。默认显示全部的行
      • decimal:一个字符串,指定了小数点的格式
      • border:一个整数,给出了border属性的值。
      • buf:指定将HTML写到哪里,它是一个StringIO-like对象
      • col_space:一个整数,给出每一列最小宽度
      • header:一个布尔值,如果为True,则打印列名
      • columns:一个序列,指定要输出哪些列
      • index:一个布尔值,如果为True,则打印index labels
      • formatters:一个一元函数的列表,或者一元函数的字典。给出了每一列的转换成字符串的函数
      • float_format:一个一元函数,给出了浮点数转换成字符串的函数
      • justify:左对齐还是右对齐。可以为'left'/'right'

      详解Pandas用法_02_第95张图片 详解Pandas用法_02_第96张图片 详解Pandas用法_02_第97张图片

    6. SQL

    1. read_sql_table从指定数据表中,提取你所需要的列。

       

       

       
        pandas.read_sql_table(table_name, con, schema=None, index_col=None,
        coerce_float=True, parse_dates=None, columns=None, chunksize=None)
      • table_name:一个字符串,指定了数据库的表名

      • con:一个SQLAlchemy conectable或者一个database string URI,指定了连接对象它就是SQLAlchemy中的Engine对象。

      • schema:一个字符串,给出了SQL schema(在mysql中就是database

      • index_col:一个字符串或者字符串列表,指定哪一列或者哪些列作为index

      • coerce_float:一个布尔值,如果为True,则试图转换结果到数值类型

      • parse_dates:一个列表或者字典。指定如何解析日期:

        • 列名的列表:这些列将被解析为日期
        • 字典{col_name:format_str}:给出了那些列被解析为日期,以及解析字符串
        • 字典{col_name:arg dict}:给出了哪些列被解析为日期,arg dict将传递给pandas.to_datetime()函数来解析日期
      • columns:一个列表,给出了将从sql中提取哪些列

      • chunksize:一个整数。如果给出了,则函数返回的是一个迭代器,每次迭代时,返回chunksize行的数据。

    2. read_sql_query可以选择select query语句。因此你可以执行多表联合查询。

       

       

       
        pandas.read_sql_query(sql, con, index_col=None, coerce_float=True,
        params=None, parse_dates=None, chunksize=None)
      • sql:一个SQL查询字符串,或者SQLAlchemy Selectable对象。
      • params:一个列表,元组或者字典。用于传递给sql查询语句。比如:sqluses %(name)s...,因此params{'name':'xxxx'}
      • 其他参数见read_sql_table

      详解Pandas用法_02_第98张图片

    3. read_sql是前两者的一个包装,它可以根据sql参数,自由地选择使用哪个方式。

       

       

       
        pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None,
        parse_dates=None, columns=None, chunksize=None)
      • sql:一个数据表名,或者查询字符串,或者SQLAlchemy Selectable对象。如果为表名,则使用read_sql_table;如果为后两者,则使用read_sql_query
    4. pandas对象的.to_sql()方法用于插入数据库。

       

       

       
        Series/DataFrame.to_sql(name, con, flavor=None, schema=None, if_exists='fail',
        index=True, index_label=None, chunksize=None, dtype=None)
      • name:一个字符串,指定表名
      • con:一个SQLAlchemy conectable或者一个database string URI,指定了连接对象。它就是SQLAlchemy中的Engine对象。
      • flavor:被废弃的参数
      • schema:一个字符串,指定了SQL schema
      • if_exists:一个字符串,指定当数据表已存在时如何。可以为:
      • 'fail':什么都不做(即不存储数据)
      • 'replace':删除数据表,创建新表,然后插入数据
      • 'append':如果数据表不存在则创建数据表然后插入数据。入股数据表已存在,则追加数据
      • index:一个布尔值。如果为True,则将index作为一列数据插入数据库
      • index_labelindex的存储名。如果index=True,且index_label=None,则使用index.name
      • chunksize:一个整数。 如果为None,则一次写入所有的记录。如果非空,则一次写入chunksize大小的记录
      • dtype:一个字典。给出了各列的存储类型。

      详解Pandas用法_02_第99张图片

    你可能感兴趣的:(Python)