{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 十分钟入门 pandas\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**10 Minutes to pandas**\n", "\n", "**官方原文地址:**[在这里](https://pandas.pydata.org/pandas-docs/version/0.22.0/10min.html)\n", "\n", "运行环境:Jupyter Notebook, Python 3.7\n", "\n", "主要是翻译了官方的教程,下面都是自己在 Jupyter Notebook 里跑的,顺便记了点笔记吧。\n", "\n", "> 首发于 MiaoTony's 小窝,**Blog 文章地址:**[数据科学 | 十分钟入门pandas/常用方法笔记](https://miaotony.xyz/2020/04/17/DataScience_10MinutesToPandas/)\n", ">\n", ">欢迎来我的博客转转呢~" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0x01 导入模块" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "这些都是常用别名了呢(" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0x02 创建对象 Object Creation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "传递一个list对象来创建一个Series,pandas会默认创建整型索引(index)。" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 1.0\n", "1 3.0\n", "2 5.0\n", "3 NaN\n", "4 6.0\n", "5 8.0\n", "dtype: float64" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = pd.Series([1,3,5,np.nan,6,8])\n", "s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "传递一个numpy array,时间索引以及列标签来创建一个DataFrame" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2020-04-16', '2020-04-17', '2020-04-18', '2020-04-19',\n", " '2020-04-20', '2020-04-21'],\n", " dtype='datetime64[ns]', freq='D')" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dates = pd.date_range('20200416', periods=6)\n", "dates" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2020-04-16-0.2280840.7125210.7433780.526823
2020-04-17-0.4239230.564346-2.3189310.080931
2020-04-18-2.0322432.0468271.176614-0.365556
2020-04-19-1.2000051.109991-1.5278041.068642
2020-04-20-0.5350311.3514200.907865-1.074013
2020-04-21-0.6147340.027143-0.420875-0.333819
\n", "
" ], "text/plain": [ " A B C D\n", "2020-04-16 -0.228084 0.712521 0.743378 0.526823\n", "2020-04-17 -0.423923 0.564346 -2.318931 0.080931\n", "2020-04-18 -2.032243 2.046827 1.176614 -0.365556\n", "2020-04-19 -1.200005 1.109991 -1.527804 1.068642\n", "2020-04-20 -0.535031 1.351420 0.907865 -1.074013\n", "2020-04-21 -0.614734 0.027143 -0.420875 -0.333819" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "传递一个能够被转换成类似序列结构的字典对象来创建一个DataFrame" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDEF
01.02020-04-16 18:38:001.03testfoo
11.02020-04-16 18:38:001.03trainfoo
21.02020-04-16 18:38:001.03testfoo
31.02020-04-16 18:38:001.03trainfoo
\n", "
" ], "text/plain": [ " A B C D E F\n", "0 1.0 2020-04-16 18:38:00 1.0 3 test foo\n", "1 1.0 2020-04-16 18:38:00 1.0 3 train foo\n", "2 1.0 2020-04-16 18:38:00 1.0 3 test foo\n", "3 1.0 2020-04-16 18:38:00 1.0 3 train foo" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2 = pd.DataFrame({ 'A' : 1.,\n", " 'B' : pd.Timestamp('20200416183800'),\n", " 'C' : pd.Series(1,index=list(range(4)),dtype='float32'),\n", " 'D' : np.array([3] * 4,dtype='int32'),\n", " 'E' : pd.Categorical([\"test\",\"train\",\"test\",\"train\"]),\n", " 'F' : 'foo' })\n", "df2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "查看他们的数据类型(dtypes)." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A float64\n", "B datetime64[ns]\n", "C float32\n", "D int32\n", "E category\n", "F object\n", "dtype: object" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.dtypes" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['A',\n", " 'B',\n", " 'C',\n", " 'D',\n", " 'E',\n", " 'F',\n", " 'T',\n", " '_AXIS_ALIASES',\n", " '_AXIS_IALIASES',\n", " '_AXIS_LEN',\n", " '_AXIS_NAMES',\n", " '_AXIS_NUMBERS',\n", " '_AXIS_ORDERS',\n", " '_AXIS_REVERSED',\n", " '_AXIS_SLICEMAP',\n", " '__abs__',\n", " '__add__',\n", " '__and__',\n", " '__array__',\n", " '__array_priority__',\n", " '__array_wrap__',\n", " '__bool__',\n", " '__bytes__',\n", " '__class__',\n", " '__contains__',\n", " '__copy__',\n", " '__deepcopy__',\n", " '__delattr__',\n", " '__delitem__',\n", " '__dict__',\n", " '__dir__',\n", " '__div__',\n", " '__doc__',\n", " '__eq__',\n", " '__finalize__',\n", " '__floordiv__',\n", " '__format__',\n", " '__ge__',\n", " '__getattr__',\n", " '__getattribute__',\n", " '__getitem__',\n", " '__getstate__',\n", " '__gt__',\n", " '__hash__',\n", " '__iadd__',\n", " '__iand__',\n", " '__ifloordiv__',\n", " '__imod__',\n", " '__imul__',\n", " '__init__',\n", " '__init_subclass__',\n", " '__invert__',\n", " '__ior__',\n", " '__ipow__',\n", " '__isub__',\n", " '__iter__',\n", " '__itruediv__',\n", " '__ixor__',\n", " '__le__',\n", " '__len__',\n", " '__lt__',\n", " '__matmul__',\n", " '__mod__',\n", " '__module__',\n", " '__mul__',\n", " '__ne__',\n", " '__neg__',\n", " '__new__',\n", " '__nonzero__',\n", " '__or__',\n", " '__pos__',\n", " '__pow__',\n", " '__radd__',\n", " '__rand__',\n", " '__rdiv__',\n", " '__reduce__',\n", " '__reduce_ex__',\n", " '__repr__',\n", " '__rfloordiv__',\n", " '__rmatmul__',\n", " '__rmod__',\n", " '__rmul__',\n", " '__ror__',\n", " '__round__',\n", " '__rpow__',\n", " '__rsub__',\n", " '__rtruediv__',\n", " '__rxor__',\n", " '__setattr__',\n", " '__setitem__',\n", " '__setstate__',\n", " '__sizeof__',\n", " '__str__',\n", " '__sub__',\n", " '__subclasshook__',\n", " '__truediv__',\n", " '__unicode__',\n", " '__weakref__',\n", " '__xor__',\n", " '_accessors',\n", " '_add_numeric_operations',\n", " '_add_series_only_operations',\n", " '_add_series_or_dataframe_operations',\n", " '_agg_by_level',\n", " '_agg_examples_doc',\n", " '_agg_summary_and_see_also_doc',\n", " '_aggregate',\n", " '_aggregate_multiple_funcs',\n", " '_align_frame',\n", " '_align_series',\n", " '_box_col_values',\n", " '_box_item_values',\n", " '_builtin_table',\n", " '_check_inplace_setting',\n", " '_check_is_chained_assignment_possible',\n", " '_check_label_or_level_ambiguity',\n", " '_check_percentile',\n", " '_check_setitem_copy',\n", " '_clear_item_cache',\n", " '_clip_with_one_bound',\n", " '_clip_with_scalar',\n", " '_combine_const',\n", " '_combine_frame',\n", " '_combine_match_columns',\n", " '_combine_match_index',\n", " '_consolidate',\n", " '_consolidate_inplace',\n", " '_construct_axes_dict',\n", " '_construct_axes_dict_for_slice',\n", " '_construct_axes_dict_from',\n", " '_construct_axes_from_arguments',\n", " '_constructor',\n", " '_constructor_expanddim',\n", " '_constructor_sliced',\n", " '_convert',\n", " '_count_level',\n", " '_create_indexer',\n", " '_cython_table',\n", " '_deprecations',\n", " '_dir_additions',\n", " '_dir_deletions',\n", " '_drop_axis',\n", " '_drop_labels_or_levels',\n", " '_ensure_valid_index',\n", " '_expand_axes',\n", " '_find_valid_index',\n", " '_from_arrays',\n", " '_from_axes',\n", " '_get_agg_axis',\n", " '_get_axis',\n", " '_get_axis_name',\n", " '_get_axis_number',\n", " '_get_axis_resolvers',\n", " '_get_block_manager_axis',\n", " '_get_bool_data',\n", " '_get_cacher',\n", " '_get_index_resolvers',\n", " '_get_item_cache',\n", " '_get_label_or_level_values',\n", " '_get_numeric_data',\n", " '_get_value',\n", " '_get_values',\n", " '_getitem_bool_array',\n", " '_getitem_frame',\n", " '_getitem_multilevel',\n", " '_gotitem',\n", " '_iget_item_cache',\n", " '_indexed_same',\n", " '_info_axis',\n", " '_info_axis_name',\n", " '_info_axis_number',\n", " '_info_repr',\n", " '_init_mgr',\n", " '_internal_names',\n", " '_internal_names_set',\n", " '_is_builtin_func',\n", " '_is_cached',\n", " '_is_copy',\n", " '_is_cython_func',\n", " '_is_datelike_mixed_type',\n", " '_is_homogeneous_type',\n", " '_is_label_or_level_reference',\n", " '_is_label_reference',\n", " '_is_level_reference',\n", " '_is_mixed_type',\n", " '_is_numeric_mixed_type',\n", " '_is_view',\n", " '_ix',\n", " '_ixs',\n", " '_join_compat',\n", " '_maybe_cache_changed',\n", " '_maybe_update_cacher',\n", " '_metadata',\n", " '_needs_reindex_multi',\n", " '_obj_with_exclusions',\n", " '_protect_consolidate',\n", " '_reduce',\n", " '_reindex_axes',\n", " '_reindex_columns',\n", " '_reindex_index',\n", " '_reindex_multi',\n", " '_reindex_with_indexers',\n", " '_repr_data_resource_',\n", " '_repr_fits_horizontal_',\n", " '_repr_fits_vertical_',\n", " '_repr_html_',\n", " '_repr_latex_',\n", " '_reset_cache',\n", " '_reset_cacher',\n", " '_sanitize_column',\n", " '_selected_obj',\n", " '_selection',\n", " '_selection_list',\n", " '_selection_name',\n", " '_series',\n", " '_set_as_cached',\n", " '_set_axis',\n", " '_set_axis_name',\n", " '_set_is_copy',\n", " '_set_item',\n", " '_set_value',\n", " '_setitem_array',\n", " '_setitem_frame',\n", " '_setitem_slice',\n", " '_setup_axes',\n", " '_shallow_copy',\n", " '_slice',\n", " '_stat_axis',\n", " '_stat_axis_name',\n", " '_stat_axis_number',\n", " '_take',\n", " '_to_dict_of_blocks',\n", " '_try_aggregate_string_function',\n", " '_typ',\n", " '_unpickle_frame_compat',\n", " '_unpickle_matrix_compat',\n", " '_update_inplace',\n", " '_validate_dtype',\n", " '_values',\n", " '_where',\n", " '_xs',\n", " 'abs',\n", " 'add',\n", " 'add_prefix',\n", " 'add_suffix',\n", " 'agg',\n", " 'aggregate',\n", " 'align',\n", " 'all',\n", " 'any',\n", " 'append',\n", " 'apply',\n", " 'applymap',\n", " 'as_matrix',\n", " 'asfreq',\n", " 'asof',\n", " 'assign',\n", " 'astype',\n", " 'at',\n", " 'at_time',\n", " 'axes',\n", " 'between_time',\n", " 'bfill',\n", " 'bool',\n", " 'boxplot',\n", " 'clip',\n", " 'clip_lower',\n", " 'clip_upper',\n", " 'columns',\n", " 'combine',\n", " 'combine_first',\n", " 'compound',\n", " 'copy',\n", " 'corr',\n", " 'corrwith',\n", " 'count',\n", " 'cov',\n", " 'cummax',\n", " 'cummin',\n", " 'cumprod',\n", " 'cumsum',\n", " 'describe',\n", " 'diff',\n", " 'div',\n", " 'divide',\n", " 'dot',\n", " 'drop',\n", " 'drop_duplicates',\n", " 'droplevel',\n", " 'dropna',\n", " 'dtypes',\n", " 'duplicated',\n", " 'empty',\n", " 'eq',\n", " 'equals',\n", " 'eval',\n", " 'ewm',\n", " 'expanding',\n", " 'ffill',\n", " 'fillna',\n", " 'filter',\n", " 'first',\n", " 'first_valid_index',\n", " 'floordiv',\n", " 'from_dict',\n", " 'from_records',\n", " 'ftypes',\n", " 'ge',\n", " 'get',\n", " 'get_dtype_counts',\n", " 'get_ftype_counts',\n", " 'get_values',\n", " 'groupby',\n", " 'gt',\n", " 'head',\n", " 'hist',\n", " 'iat',\n", " 'idxmax',\n", " 'idxmin',\n", " 'iloc',\n", " 'index',\n", " 'infer_objects',\n", " 'info',\n", " 'insert',\n", " 'interpolate',\n", " 'isin',\n", " 'isna',\n", " 'isnull',\n", " 'items',\n", " 'iteritems',\n", " 'iterrows',\n", " 'itertuples',\n", " 'ix',\n", " 'join',\n", " 'keys',\n", " 'kurt',\n", " 'kurtosis',\n", " 'last',\n", " 'last_valid_index',\n", " 'le',\n", " 'loc',\n", " 'lookup',\n", " 'lt',\n", " 'mad',\n", " 'mask',\n", " 'max',\n", " 'mean',\n", " 'median',\n", " 'melt',\n", " 'memory_usage',\n", " 'merge',\n", " 'min',\n", " 'mod',\n", " 'mode',\n", " 'mul',\n", " 'multiply',\n", " 'ndim',\n", " 'ne',\n", " 'nlargest',\n", " 'notna',\n", " 'notnull',\n", " 'nsmallest',\n", " 'nunique',\n", " 'pct_change',\n", " 'pipe',\n", " 'pivot',\n", " 'pivot_table',\n", " 'plot',\n", " 'pop',\n", " 'pow',\n", " 'prod',\n", " 'product',\n", " 'quantile',\n", " 'query',\n", " 'radd',\n", " 'rank',\n", " 'rdiv',\n", " 'reindex',\n", " 'reindex_axis',\n", " 'reindex_like',\n", " 'rename',\n", " 'rename_axis',\n", " 'reorder_levels',\n", " 'replace',\n", " 'resample',\n", " 'reset_index',\n", " 'rfloordiv',\n", " 'rmod',\n", " 'rmul',\n", " 'rolling',\n", " 'round',\n", " 'rpow',\n", " 'rsub',\n", " 'rtruediv',\n", " 'sample',\n", " 'select',\n", " 'select_dtypes',\n", " 'sem',\n", " 'set_axis',\n", " 'set_index',\n", " 'shape',\n", " 'shift',\n", " 'size',\n", " 'skew',\n", " 'slice_shift',\n", " 'sort_index',\n", " 'sort_values',\n", " 'squeeze',\n", " 'stack',\n", " 'std',\n", " 'style',\n", " 'sub',\n", " 'subtract',\n", " 'sum',\n", " 'swapaxes',\n", " 'swaplevel',\n", " 'tail',\n", " 'take',\n", " 'timetuple',\n", " 'to_clipboard',\n", " 'to_csv',\n", " 'to_dense',\n", " 'to_dict',\n", " 'to_excel',\n", " 'to_feather',\n", " 'to_gbq',\n", " 'to_hdf',\n", " 'to_html',\n", " 'to_json',\n", " 'to_latex',\n", " 'to_msgpack',\n", " 'to_numpy',\n", " 'to_panel',\n", " 'to_parquet',\n", " 'to_period',\n", " 'to_pickle',\n", " 'to_records',\n", " 'to_sparse',\n", " 'to_sql',\n", " 'to_stata',\n", " 'to_string',\n", " 'to_timestamp',\n", " 'to_xarray',\n", " 'transform',\n", " 'transpose',\n", " 'truediv',\n", " 'truncate',\n", " 'tshift',\n", " 'tz_convert',\n", " 'tz_localize',\n", " 'unstack',\n", " 'update',\n", " 'values',\n", " 'var',\n", " 'where',\n", " 'xs']" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dir(df2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0x03 查看数据 Viewing Data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "查看 frame 中头部和尾部的行" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2020-04-16-0.2280840.7125210.7433780.526823
2020-04-17-0.4239230.564346-2.3189310.080931
2020-04-18-2.0322432.0468271.176614-0.365556
2020-04-19-1.2000051.109991-1.5278041.068642
2020-04-20-0.5350311.3514200.907865-1.074013
\n", "
" ], "text/plain": [ " A B C D\n", "2020-04-16 -0.228084 0.712521 0.743378 0.526823\n", "2020-04-17 -0.423923 0.564346 -2.318931 0.080931\n", "2020-04-18 -2.032243 2.046827 1.176614 -0.365556\n", "2020-04-19 -1.200005 1.109991 -1.527804 1.068642\n", "2020-04-20 -0.535031 1.351420 0.907865 -1.074013" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2020-04-16-0.2280840.7125210.7433780.526823
2020-04-17-0.4239230.564346-2.3189310.080931
\n", "
" ], "text/plain": [ " A B C D\n", "2020-04-16 -0.228084 0.712521 0.743378 0.526823\n", "2020-04-17 -0.423923 0.564346 -2.318931 0.080931" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head(2) # 前两行" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2020-04-19-1.2000051.109991-1.5278041.068642
2020-04-20-0.5350311.3514200.907865-1.074013
2020-04-21-0.6147340.027143-0.420875-0.333819
\n", "
" ], "text/plain": [ " A B C D\n", "2020-04-19 -1.200005 1.109991 -1.527804 1.068642\n", "2020-04-20 -0.535031 1.351420 0.907865 -1.074013\n", "2020-04-21 -0.614734 0.027143 -0.420875 -0.333819" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.tail(3) # 倒数三行" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "显示索引、列和底层的(underlying) numpy 数据" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2020-04-16-0.2280840.7125210.7433780.526823
2020-04-17-0.4239230.564346-2.3189310.080931
2020-04-18-2.0322432.0468271.176614-0.365556
2020-04-19-1.2000051.109991-1.5278041.068642
2020-04-20-0.5350311.3514200.907865-1.074013
2020-04-21-0.6147340.027143-0.420875-0.333819
\n", "
" ], "text/plain": [ " A B C D\n", "2020-04-16 -0.228084 0.712521 0.743378 0.526823\n", "2020-04-17 -0.423923 0.564346 -2.318931 0.080931\n", "2020-04-18 -2.032243 2.046827 1.176614 -0.365556\n", "2020-04-19 -1.200005 1.109991 -1.527804 1.068642\n", "2020-04-20 -0.535031 1.351420 0.907865 -1.074013\n", "2020-04-21 -0.614734 0.027143 -0.420875 -0.333819" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2020-04-16', '2020-04-17', '2020-04-18', '2020-04-19',\n", " '2020-04-20', '2020-04-21'],\n", " dtype='datetime64[ns]', freq='D')" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.index" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Int64Index([0, 1, 2, 3], dtype='int64')" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.index" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['A', 'B', 'C', 'D'], dtype='object')" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.columns" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[-0.22808386, 0.71252123, 0.74337822, 0.52682341],\n", " [-0.42392275, 0.56434629, -2.31893066, 0.08093058],\n", " [-2.03224294, 2.04682736, 1.17661398, -0.3655562 ],\n", " [-1.20000469, 1.10999124, -1.52780407, 1.06864157],\n", " [-0.53503099, 1.35142044, 0.90786509, -1.07401348],\n", " [-0.61473412, 0.02714293, -0.42087502, -0.33381946]])" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.values" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1.0, Timestamp('2020-04-16 18:38:00'), 1.0, 3, 'test', 'foo'],\n", " [1.0, Timestamp('2020-04-16 18:38:00'), 1.0, 3, 'train', 'foo'],\n", " [1.0, Timestamp('2020-04-16 18:38:00'), 1.0, 3, 'test', 'foo'],\n", " [1.0, Timestamp('2020-04-16 18:38:00'), 1.0, 3, 'train', 'foo']],\n", " dtype=object)" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.values" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "\n" ] } ], "source": [ "print(type(df))\n", "print(type(df.columns))\n", "print(type(df.values))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`describe` 函数对于数据的快速统计汇总" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
count6.0000006.0000006.0000006.000000
mean-0.8390030.968708-0.239959-0.016166
std0.6696790.6992081.4355860.751411
min-2.0322430.027143-2.318931-1.074013
25%-1.0536870.601390-1.251072-0.357622
50%-0.5748830.9112560.161252-0.126444
75%-0.4517001.2910630.8667430.415350
max-0.2280842.0468271.1766141.068642
\n", "
" ], "text/plain": [ " A B C D\n", "count 6.000000 6.000000 6.000000 6.000000\n", "mean -0.839003 0.968708 -0.239959 -0.016166\n", "std 0.669679 0.699208 1.435586 0.751411\n", "min -2.032243 0.027143 -2.318931 -1.074013\n", "25% -1.053687 0.601390 -1.251072 -0.357622\n", "50% -0.574883 0.911256 0.161252 -0.126444\n", "75% -0.451700 1.291063 0.866743 0.415350\n", "max -0.228084 2.046827 1.176614 1.068642" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe()" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ACD
count4.04.04.0
mean1.01.03.0
std0.00.00.0
min1.01.03.0
25%1.01.03.0
50%1.01.03.0
75%1.01.03.0
max1.01.03.0
\n", "
" ], "text/plain": [ " A C D\n", "count 4.0 4.0 4.0\n", "mean 1.0 1.0 3.0\n", "std 0.0 0.0 0.0\n", "min 1.0 1.0 3.0\n", "25% 1.0 1.0 3.0\n", "50% 1.0 1.0 3.0\n", "75% 1.0 1.0 3.0\n", "max 1.0 1.0 3.0" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对数据进行转置(Transposing)" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
2020-04-16 00:00:002020-04-17 00:00:002020-04-18 00:00:002020-04-19 00:00:002020-04-20 00:00:002020-04-21 00:00:00
A-0.228084-0.423923-2.032243-1.200005-0.535031-0.614734
B0.7125210.5643462.0468271.1099911.3514200.027143
C0.743378-2.3189311.176614-1.5278040.907865-0.420875
D0.5268230.080931-0.3655561.068642-1.074013-0.333819
\n", "
" ], "text/plain": [ " 2020-04-16 2020-04-17 2020-04-18 2020-04-19 2020-04-20 2020-04-21\n", "A -0.228084 -0.423923 -2.032243 -1.200005 -0.535031 -0.614734\n", "B 0.712521 0.564346 2.046827 1.109991 1.351420 0.027143\n", "C 0.743378 -2.318931 1.176614 -1.527804 0.907865 -0.420875\n", "D 0.526823 0.080931 -0.365556 1.068642 -1.074013 -0.333819" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.T" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0123
A1111
B2020-04-16 18:38:002020-04-16 18:38:002020-04-16 18:38:002020-04-16 18:38:00
C1111
D3333
Etesttraintesttrain
Ffoofoofoofoo
\n", "
" ], "text/plain": [ " 0 1 2 \\\n", "A 1 1 1 \n", "B 2020-04-16 18:38:00 2020-04-16 18:38:00 2020-04-16 18:38:00 \n", "C 1 1 1 \n", "D 3 3 3 \n", "E test train test \n", "F foo foo foo \n", "\n", " 3 \n", "A 1 \n", "B 2020-04-16 18:38:00 \n", "C 1 \n", "D 3 \n", "E train \n", "F foo " ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "按照某一坐标轴进行排序" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DCBA
2020-04-160.5268230.7433780.712521-0.228084
2020-04-170.080931-2.3189310.564346-0.423923
2020-04-18-0.3655561.1766142.046827-2.032243
2020-04-191.068642-1.5278041.109991-1.200005
2020-04-20-1.0740130.9078651.351420-0.535031
2020-04-21-0.333819-0.4208750.027143-0.614734
\n", "
" ], "text/plain": [ " D C B A\n", "2020-04-16 0.526823 0.743378 0.712521 -0.228084\n", "2020-04-17 0.080931 -2.318931 0.564346 -0.423923\n", "2020-04-18 -0.365556 1.176614 2.046827 -2.032243\n", "2020-04-19 1.068642 -1.527804 1.109991 -1.200005\n", "2020-04-20 -1.074013 0.907865 1.351420 -0.535031\n", "2020-04-21 -0.333819 -0.420875 0.027143 -0.614734" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_index(axis=1, ascending=False) # 降序" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2020-04-16-0.2280840.7125210.7433780.526823
2020-04-17-0.4239230.564346-2.3189310.080931
2020-04-18-2.0322432.0468271.176614-0.365556
2020-04-19-1.2000051.109991-1.5278041.068642
2020-04-20-0.5350311.3514200.907865-1.074013
2020-04-21-0.6147340.027143-0.420875-0.333819
\n", "
" ], "text/plain": [ " A B C D\n", "2020-04-16 -0.228084 0.712521 0.743378 0.526823\n", "2020-04-17 -0.423923 0.564346 -2.318931 0.080931\n", "2020-04-18 -2.032243 2.046827 1.176614 -0.365556\n", "2020-04-19 -1.200005 1.109991 -1.527804 1.068642\n", "2020-04-20 -0.535031 1.351420 0.907865 -1.074013\n", "2020-04-21 -0.614734 0.027143 -0.420875 -0.333819" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_index(axis=1, ascending=True) # 升序(默认)" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2020-04-21-0.6147340.027143-0.420875-0.333819
2020-04-20-0.5350311.3514200.907865-1.074013
2020-04-19-1.2000051.109991-1.5278041.068642
2020-04-18-2.0322432.0468271.176614-0.365556
2020-04-17-0.4239230.564346-2.3189310.080931
2020-04-16-0.2280840.7125210.7433780.526823
\n", "
" ], "text/plain": [ " A B C D\n", "2020-04-21 -0.614734 0.027143 -0.420875 -0.333819\n", "2020-04-20 -0.535031 1.351420 0.907865 -1.074013\n", "2020-04-19 -1.200005 1.109991 -1.527804 1.068642\n", "2020-04-18 -2.032243 2.046827 1.176614 -0.365556\n", "2020-04-17 -0.423923 0.564346 -2.318931 0.080931\n", "2020-04-16 -0.228084 0.712521 0.743378 0.526823" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_index(axis=0, ascending=False) # 以第0轴(行)来排序,降序" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "按值进行排序,默认为升序" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2020-04-21-0.6147340.027143-0.420875-0.333819
2020-04-17-0.4239230.564346-2.3189310.080931
2020-04-16-0.2280840.7125210.7433780.526823
2020-04-19-1.2000051.109991-1.5278041.068642
2020-04-20-0.5350311.3514200.907865-1.074013
2020-04-18-2.0322432.0468271.176614-0.365556
\n", "
" ], "text/plain": [ " A B C D\n", "2020-04-21 -0.614734 0.027143 -0.420875 -0.333819\n", "2020-04-17 -0.423923 0.564346 -2.318931 0.080931\n", "2020-04-16 -0.228084 0.712521 0.743378 0.526823\n", "2020-04-19 -1.200005 1.109991 -1.527804 1.068642\n", "2020-04-20 -0.535031 1.351420 0.907865 -1.074013\n", "2020-04-18 -2.032243 2.046827 1.176614 -0.365556" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values(by='B')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0x04 选择数据 Selection\n", "> **注意:** 虽然标准的 Python/Numpy 的选择和设置表达式都非常易懂且方便用于交互使用,但是作为工程使用的代码,推荐使用经过优化的 pandas 数据访问方法: `.at`, `.iat`, `.loc`, `.iloc` 和 `.ix`。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 0x04-1 获取 Getting\n", "选择一个单独的列,这将会返回一个 `Series`,等效于 `df.A`" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2020-04-16 -0.228084\n", "2020-04-17 -0.423923\n", "2020-04-18 -2.032243\n", "2020-04-19 -1.200005\n", "2020-04-20 -0.535031\n", "2020-04-21 -0.614734\n", "Freq: D, Name: A, dtype: float64" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['A']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " 通过`[]`进行选择,可以用来行进行切片(slice)" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2020-04-17-0.4239230.564346-2.3189310.080931
2020-04-18-2.0322432.0468271.176614-0.365556
\n", "
" ], "text/plain": [ " A B C D\n", "2020-04-17 -0.423923 0.564346 -2.318931 0.080931\n", "2020-04-18 -2.032243 2.046827 1.176614 -0.365556" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[1:3]" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2020-04-18-2.0322432.0468271.176614-0.365556
2020-04-19-1.2000051.109991-1.5278041.068642
2020-04-20-0.5350311.3514200.907865-1.074013
\n", "
" ], "text/plain": [ " A B C D\n", "2020-04-18 -2.032243 2.046827 1.176614 -0.365556\n", "2020-04-19 -1.200005 1.109991 -1.527804 1.068642\n", "2020-04-20 -0.535031 1.351420 0.907865 -1.074013" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['20200418':'20200420']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 0x4-2 通过标签选择 Selection by Label\n", "**利用 pandas 的 `.loc`, `.at` 方法**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "使用标签来获取一个交叉的区域" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Timestamp('2020-04-16 00:00:00', freq='D')" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dates[0]" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A -0.228084\n", "B 0.712521\n", "C 0.743378\n", "D 0.526823\n", "Name: 2020-04-16 00:00:00, dtype: float64" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[dates[0]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "用标签来在多个轴上进行选择" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
2020-04-16-0.2280840.712521
2020-04-17-0.4239230.564346
2020-04-18-2.0322432.046827
2020-04-19-1.2000051.109991
2020-04-20-0.5350311.351420
2020-04-21-0.6147340.027143
\n", "
" ], "text/plain": [ " A B\n", "2020-04-16 -0.228084 0.712521\n", "2020-04-17 -0.423923 0.564346\n", "2020-04-18 -2.032243 2.046827\n", "2020-04-19 -1.200005 1.109991\n", "2020-04-20 -0.535031 1.351420\n", "2020-04-21 -0.614734 0.027143" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[:,['A','B']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "利用标签来切片\n", "\n", "注意此处的切片**两端都包含(左闭右闭)**" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
2020-04-18-2.0322432.046827
2020-04-19-1.2000051.109991
2020-04-20-0.5350311.351420
\n", "
" ], "text/plain": [ " A B\n", "2020-04-18 -2.032243 2.046827\n", "2020-04-19 -1.200005 1.109991\n", "2020-04-20 -0.535031 1.351420" ] }, "execution_count": 103, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc['20200418':'20200420',['A','B']]" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABC
2020-04-18-2.0322432.0468271.176614
2020-04-19-1.2000051.109991-1.527804
2020-04-20-0.5350311.3514200.907865
2020-04-21-0.6147340.027143-0.420875
\n", "
" ], "text/plain": [ " A B C\n", "2020-04-18 -2.032243 2.046827 1.176614\n", "2020-04-19 -1.200005 1.109991 -1.527804\n", "2020-04-20 -0.535031 1.351420 0.907865\n", "2020-04-21 -0.614734 0.027143 -0.420875" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[dates[2]:,:'C']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对于返回的对象进行维度缩减" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A -1.200005\n", "B 1.109991\n", "Name: 2020-04-19 00:00:00, dtype: float64" ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc['20200419',['A','B']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "获取一个标量" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-2.0322429408627056" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[dates[2],'A']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "快速访问一个标量(与上一个方法等价)" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-2.0322429408627056" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.at[dates[2],'A']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 0x04-3 通过位置进行选择 Selection by Position\n", "**利用的是 pandas 里的 `.iloc`, `.iat` 方法**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过传递整数值进行位置选择" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A -1.200005\n", "B 1.109991\n", "C -1.527804\n", "D 1.068642\n", "Name: 2020-04-19 00:00:00, dtype: float64" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[3] " ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2020-04-16 0.743378\n", "2020-04-17 -2.318931\n", "2020-04-18 1.176614\n", "2020-04-19 -1.527804\n", "2020-04-20 0.907865\n", "2020-04-21 -0.420875\n", "Freq: D, Name: C, dtype: float64" ] }, "execution_count": 116, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[:,2] # [行,列] 或 [第0维,第1维]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "利用数值进行切片,类似于 numpy/python\n", "\n", "**注意一下,这里的切片是普通的切片,即左闭右开。**" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
2020-04-19-1.2000051.109991
2020-04-20-0.5350311.351420
\n", "
" ], "text/plain": [ " A B\n", "2020-04-19 -1.200005 1.109991\n", "2020-04-20 -0.535031 1.351420" ] }, "execution_count": 117, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[3:5,0:2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "可以指定一个位置的列表来选择数据区域" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AC
2020-04-17-0.423923-2.318931
2020-04-18-2.0322431.176614
2020-04-20-0.5350310.907865
\n", "
" ], "text/plain": [ " A C\n", "2020-04-17 -0.423923 -2.318931\n", "2020-04-18 -2.032243 1.176614\n", "2020-04-20 -0.535031 0.907865" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[[1,2,4],[0,2]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对行进行切片" ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2020-04-17-0.4239230.564346-2.3189310.080931
2020-04-18-2.0322432.0468271.176614-0.365556
\n", "
" ], "text/plain": [ " A B C D\n", "2020-04-17 -0.423923 0.564346 -2.318931 0.080931\n", "2020-04-18 -2.032243 2.046827 1.176614 -0.365556" ] }, "execution_count": 119, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[1:3,:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对列进行切片" ] }, { "cell_type": "code", "execution_count": 123, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
BC
2020-04-160.7125210.743378
2020-04-170.564346-2.318931
2020-04-182.0468271.176614
2020-04-191.109991-1.527804
2020-04-201.3514200.907865
2020-04-210.027143-0.420875
\n", "
" ], "text/plain": [ " B C\n", "2020-04-16 0.712521 0.743378\n", "2020-04-17 0.564346 -2.318931\n", "2020-04-18 2.046827 1.176614\n", "2020-04-19 1.109991 -1.527804\n", "2020-04-20 1.351420 0.907865\n", "2020-04-21 0.027143 -0.420875" ] }, "execution_count": 123, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[:,1:3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "利用位置快速得到一个位置对应的值" ] }, { "cell_type": "code", "execution_count": 124, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5643462917985026" ] }, "execution_count": 124, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[1,1]" ] }, { "cell_type": "code", "execution_count": 125, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5643462917985026" ] }, "execution_count": 125, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iat[1,1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### .ix 用法(Deprecated)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`df.ix[]` 既可以通过整数索引进行数据选取,也可以通过标签索引进行数据选取。\n", "\n", "也就是说,`df.ix[]` 是 `df.loc[]` 和 `df.iloc[]` 的功能集合,且在同义词选取中,可以同时使用整数索引和标签索引。\n", "\n", "这个方法在官方的 *10 Minutes to pandas* 中没有专门说明,**不建议用这一方法,请用`.loc`和`.iloc`来索引**,那这里就提一下好了。" ] }, { "cell_type": "code", "execution_count": 305, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "D:\\Programs\\Anaconda\\lib\\site-packages\\ipykernel_launcher.py:1: DeprecationWarning: \n", ".ix is deprecated. Please use\n", ".loc for label based indexing or\n", ".iloc for positional indexing\n", "\n", "See the documentation here:\n", "http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated\n", " \"\"\"Entry point for launching an IPython kernel.\n" ] }, { "data": { "text/plain": [ "-1.363418018143355" ] }, "execution_count": 305, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.ix[1,'A']" ] }, { "cell_type": "code", "execution_count": 311, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "D:\\Programs\\Anaconda\\lib\\site-packages\\ipykernel_launcher.py:1: DeprecationWarning: \n", ".ix is deprecated. Please use\n", ".loc for label based indexing or\n", ".iloc for positional indexing\n", "\n", "See the documentation here:\n", "http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated\n", " \"\"\"Entry point for launching an IPython kernel.\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ACD
2020-04-17-11.3328347.659436-20.925183
2020-04-18-11.0406886.867701-20.157355
\n", "
" ], "text/plain": [ " A C D\n", "2020-04-17 -11.332834 7.659436 -20.925183\n", "2020-04-18 -11.040688 6.867701 -20.157355" ] }, "execution_count": 311, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.ix[dates[1:3],[0,2,3]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "从 DeprecationWarning 看来的确已经 **deprecated** 了,那就不要用了!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 0x04-4 布尔索引 Boolean Indexing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "使用一个单独列的值来选择数据" ] }, { "cell_type": "code", "execution_count": 127, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2020-04-16-0.2280840.7125210.7433780.526823
2020-04-17-0.4239230.564346-2.3189310.080931
2020-04-19-1.2000051.109991-1.5278041.068642
\n", "
" ], "text/plain": [ " A B C D\n", "2020-04-16 -0.228084 0.712521 0.743378 0.526823\n", "2020-04-17 -0.423923 0.564346 -2.318931 0.080931\n", "2020-04-19 -1.200005 1.109991 -1.527804 1.068642" ] }, "execution_count": 127, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df.D > 0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "利用**布尔条件**从一个 DataFrame 中选择数据" ] }, { "cell_type": "code", "execution_count": 129, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2020-04-16FalseTrueTrueTrue
2020-04-17FalseTrueFalseTrue
2020-04-18FalseTrueTrueFalse
2020-04-19FalseTrueFalseTrue
2020-04-20FalseTrueTrueFalse
2020-04-21FalseTrueFalseFalse
\n", "
" ], "text/plain": [ " A B C D\n", "2020-04-16 False True True True\n", "2020-04-17 False True False True\n", "2020-04-18 False True True False\n", "2020-04-19 False True False True\n", "2020-04-20 False True True False\n", "2020-04-21 False True False False" ] }, "execution_count": 129, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df>0" ] }, { "cell_type": "code", "execution_count": 130, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2020-04-16NaN0.7125210.7433780.526823
2020-04-17NaN0.564346NaN0.080931
2020-04-18NaN2.0468271.176614NaN
2020-04-19NaN1.109991NaN1.068642
2020-04-20NaN1.3514200.907865NaN
2020-04-21NaN0.027143NaNNaN
\n", "
" ], "text/plain": [ " A B C D\n", "2020-04-16 NaN 0.712521 0.743378 0.526823\n", "2020-04-17 NaN 0.564346 NaN 0.080931\n", "2020-04-18 NaN 2.046827 1.176614 NaN\n", "2020-04-19 NaN 1.109991 NaN 1.068642\n", "2020-04-20 NaN 1.351420 0.907865 NaN\n", "2020-04-21 NaN 0.027143 NaN NaN" ] }, "execution_count": 130, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df > 0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "使用 `isin()` 方法来过滤数据\n", "\n", "(is in)" ] }, { "cell_type": "code", "execution_count": 131, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDE
2020-04-16-0.2280840.7125210.7433780.526823one
2020-04-17-0.4239230.564346-2.3189310.080931one
2020-04-18-2.0322432.0468271.176614-0.365556two
2020-04-19-1.2000051.109991-1.5278041.068642three
2020-04-20-0.5350311.3514200.907865-1.074013four
2020-04-21-0.6147340.027143-0.420875-0.333819three
\n", "
" ], "text/plain": [ " A B C D E\n", "2020-04-16 -0.228084 0.712521 0.743378 0.526823 one\n", "2020-04-17 -0.423923 0.564346 -2.318931 0.080931 one\n", "2020-04-18 -2.032243 2.046827 1.176614 -0.365556 two\n", "2020-04-19 -1.200005 1.109991 -1.527804 1.068642 three\n", "2020-04-20 -0.535031 1.351420 0.907865 -1.074013 four\n", "2020-04-21 -0.614734 0.027143 -0.420875 -0.333819 three" ] }, "execution_count": 131, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3 = df.copy()\n", "df3['E'] = ['one', 'one','two','three','four','three']\n", "df3" ] }, { "cell_type": "code", "execution_count": 133, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDE
2020-04-18-2.0322432.0468271.176614-0.365556two
2020-04-20-0.5350311.3514200.907865-1.074013four
\n", "
" ], "text/plain": [ " A B C D E\n", "2020-04-18 -2.032243 2.046827 1.176614 -0.365556 two\n", "2020-04-20 -0.535031 1.351420 0.907865 -1.074013 four" ] }, "execution_count": 133, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3[df3['E'].isin(['two','four'])]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0x05 设置数据 Setting" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "设置一个新的列,自动按照索引来对其数据" ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2020-04-16 1\n", "2020-04-17 2\n", "2020-04-18 3\n", "2020-04-19 4\n", "2020-04-20 5\n", "2020-04-21 6\n", "Freq: D, dtype: int64" ] }, "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20200416', periods=6))\n", "s1" ] }, { "cell_type": "code", "execution_count": 137, "metadata": {}, "outputs": [], "source": [ "df['F'] = s1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过标签设置新的值" ] }, { "cell_type": "code", "execution_count": 145, "metadata": {}, "outputs": [], "source": [ "df.at[dates[0],'A'] = 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过标签设置新的值" ] }, { "cell_type": "code", "execution_count": 146, "metadata": {}, "outputs": [], "source": [ "df.iat[0,1] = 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过一个 numpy 数组设置一组新值" ] }, { "cell_type": "code", "execution_count": 148, "metadata": {}, "outputs": [], "source": [ "df.loc[:,'D'] = np.array([5] * len(df))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "上述操作结果如下" ] }, { "cell_type": "code", "execution_count": 149, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
2020-04-160.0000000.0000000.74337851
2020-04-17-0.4239230.564346-2.31893152
2020-04-18-2.0322432.0468271.17661453
2020-04-19-1.2000051.109991-1.52780454
2020-04-20-0.5350311.3514200.90786555
2020-04-21-0.6147340.027143-0.42087556
\n", "
" ], "text/plain": [ " A B C D F\n", "2020-04-16 0.000000 0.000000 0.743378 5 1\n", "2020-04-17 -0.423923 0.564346 -2.318931 5 2\n", "2020-04-18 -2.032243 2.046827 1.176614 5 3\n", "2020-04-19 -1.200005 1.109991 -1.527804 5 4\n", "2020-04-20 -0.535031 1.351420 0.907865 5 5\n", "2020-04-21 -0.614734 0.027143 -0.420875 5 6" ] }, "execution_count": 149, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过 where 操作来设置新的值" ] }, { "cell_type": "code", "execution_count": 151, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
2020-04-160.0000000.000000-0.743378-5-1
2020-04-17-0.423923-0.564346-2.318931-5-2
2020-04-18-2.032243-2.046827-1.176614-5-3
2020-04-19-1.200005-1.109991-1.527804-5-4
2020-04-20-0.535031-1.351420-0.907865-5-5
2020-04-21-0.614734-0.027143-0.420875-5-6
\n", "
" ], "text/plain": [ " A B C D F\n", "2020-04-16 0.000000 0.000000 -0.743378 -5 -1\n", "2020-04-17 -0.423923 -0.564346 -2.318931 -5 -2\n", "2020-04-18 -2.032243 -2.046827 -1.176614 -5 -3\n", "2020-04-19 -1.200005 -1.109991 -1.527804 -5 -4\n", "2020-04-20 -0.535031 -1.351420 -0.907865 -5 -5\n", "2020-04-21 -0.614734 -0.027143 -0.420875 -5 -6" ] }, "execution_count": 151, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2 = df.copy()\n", "df2[df2 > 0] = -df2\n", "df2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0x06 缺失值处理 Missing Data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "在pandas中,使用`np.nan`来代替缺失值,这些值将默认不会包含在计算中。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`reindex()`方法可以对指定轴上的索引进行改变/增加/删除操作,返回原始数据的一个拷贝。" ] }, { "cell_type": "code", "execution_count": 153, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDFE
2020-04-160.0000000.0000000.74337851NaN
2020-04-17-0.4239230.564346-2.31893152NaN
2020-04-18-2.0322432.0468271.17661453NaN
2020-04-19-1.2000051.109991-1.52780454NaN
\n", "
" ], "text/plain": [ " A B C D F E\n", "2020-04-16 0.000000 0.000000 0.743378 5 1 NaN\n", "2020-04-17 -0.423923 0.564346 -2.318931 5 2 NaN\n", "2020-04-18 -2.032243 2.046827 1.176614 5 3 NaN\n", "2020-04-19 -1.200005 1.109991 -1.527804 5 4 NaN" ] }, "execution_count": 153, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])\n", "df1" ] }, { "cell_type": "code", "execution_count": 154, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDFE
2020-04-160.0000000.0000000.743378511.0
2020-04-17-0.4239230.564346-2.318931521.0
2020-04-18-2.0322432.0468271.17661453NaN
2020-04-19-1.2000051.109991-1.52780454NaN
\n", "
" ], "text/plain": [ " A B C D F E\n", "2020-04-16 0.000000 0.000000 0.743378 5 1 1.0\n", "2020-04-17 -0.423923 0.564346 -2.318931 5 2 1.0\n", "2020-04-18 -2.032243 2.046827 1.176614 5 3 NaN\n", "2020-04-19 -1.200005 1.109991 -1.527804 5 4 NaN" ] }, "execution_count": 154, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1.loc[dates[0]:dates[1],'E'] = 1\n", "df1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "去掉包含缺失值的行" ] }, { "cell_type": "code", "execution_count": 155, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDFE
2020-04-160.0000000.0000000.743378511.0
2020-04-17-0.4239230.564346-2.318931521.0
\n", "
" ], "text/plain": [ " A B C D F E\n", "2020-04-16 0.000000 0.000000 0.743378 5 1 1.0\n", "2020-04-17 -0.423923 0.564346 -2.318931 5 2 1.0" ] }, "execution_count": 155, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1.dropna(how='any')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "填充缺失的值,利用`value`来指定" ] }, { "cell_type": "code", "execution_count": 158, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D F E\n", "2020-04-16 0.000000 0.000000 0.743378 5 1 1.0\n", "2020-04-17 -0.423923 0.564346 -2.318931 5 2 1.0\n", "2020-04-18 -2.032243 2.046827 1.176614 5 3 NaN\n", "2020-04-19 -1.200005 1.109991 -1.527804 5 4 NaN\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDFE
2020-04-160.0000000.0000000.743378511.0
2020-04-17-0.4239230.564346-2.318931521.0
2020-04-18-2.0322432.0468271.176614535.0
2020-04-19-1.2000051.109991-1.527804545.0
\n", "
" ], "text/plain": [ " A B C D F E\n", "2020-04-16 0.000000 0.000000 0.743378 5 1 1.0\n", "2020-04-17 -0.423923 0.564346 -2.318931 5 2 1.0\n", "2020-04-18 -2.032243 2.046827 1.176614 5 3 5.0\n", "2020-04-19 -1.200005 1.109991 -1.527804 5 4 5.0" ] }, "execution_count": 158, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(df1)\n", "df1.fillna(value=5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "获取值为`nan`的布尔值(boolean mask)" ] }, { "cell_type": "code", "execution_count": 159, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDFE
2020-04-16FalseFalseFalseFalseFalseFalse
2020-04-17FalseFalseFalseFalseFalseFalse
2020-04-18FalseFalseFalseFalseFalseTrue
2020-04-19FalseFalseFalseFalseFalseTrue
\n", "
" ], "text/plain": [ " A B C D F E\n", "2020-04-16 False False False False False False\n", "2020-04-17 False False False False False False\n", "2020-04-18 False False False False False True\n", "2020-04-19 False False False False False True" ] }, "execution_count": 159, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.isna(df1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0x07 一些常用的操作 Operations\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 0x07-1 统计 Stats\n", "这些操作**不包括缺失数据**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "执行描述性统计:" ] }, { "cell_type": "code", "execution_count": 160, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A -0.800989\n", "B 0.849955\n", "C -0.239959\n", "D 5.000000\n", "F 3.500000\n", "dtype: float64" ] }, "execution_count": 160, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.mean() # 均值,默认为列的" ] }, { "cell_type": "code", "execution_count": 163, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2020-04-16 1.348676\n", "2020-04-17 0.964299\n", "2020-04-18 1.838240\n", "2020-04-19 1.476436\n", "2020-04-20 2.344851\n", "2020-04-21 1.998307\n", "Freq: D, dtype: float64" ] }, "execution_count": 163, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.mean(1) # 指定坐标轴(此处为行)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对于拥有不同维度,需要对齐对象再进行操作。\n", "\n", "Pandas 会自动的沿着指定的维度进行广播。" ] }, { "cell_type": "code", "execution_count": 173, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2020-04-16 NaN\n", "2020-04-17 NaN\n", "2020-04-18 1.0\n", "2020-04-19 3.0\n", "2020-04-20 5.0\n", "2020-04-21 NaN\n", "Freq: D, dtype: float64" ] }, "execution_count": 173, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = pd.Series([1,3,5,np.nan,6,8], index=dates).shift(2)\n", "s" ] }, { "cell_type": "code", "execution_count": 174, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D F\n", "2020-04-16 0.000000 0.000000 0.743378 5 1\n", "2020-04-17 -0.423923 0.564346 -2.318931 5 2\n", "2020-04-18 -2.032243 2.046827 1.176614 5 3\n", "2020-04-19 -1.200005 1.109991 -1.527804 5 4\n", "2020-04-20 -0.535031 1.351420 0.907865 5 5\n", "2020-04-21 -0.614734 0.027143 -0.420875 5 6\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
2020-04-16NaNNaNNaNNaNNaN
2020-04-17NaNNaNNaNNaNNaN
2020-04-18-3.0322431.0468270.1766144.02.0
2020-04-19-4.200005-1.890009-4.5278042.01.0
2020-04-20-5.535031-3.648580-4.0921350.00.0
2020-04-21NaNNaNNaNNaNNaN
\n", "
" ], "text/plain": [ " A B C D F\n", "2020-04-16 NaN NaN NaN NaN NaN\n", "2020-04-17 NaN NaN NaN NaN NaN\n", "2020-04-18 -3.032243 1.046827 0.176614 4.0 2.0\n", "2020-04-19 -4.200005 -1.890009 -4.527804 2.0 1.0\n", "2020-04-20 -5.535031 -3.648580 -4.092135 0.0 0.0\n", "2020-04-21 NaN NaN NaN NaN NaN" ] }, "execution_count": 174, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(df)\n", "df.sub(s, axis='index') # df-s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 0x07-2 应用方法到数据 Apply\n", "Applying functions to the data" ] }, { "cell_type": "code", "execution_count": 175, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
2020-04-160.0000000.0000000.74337851
2020-04-17-0.4239230.564346-1.575552103
2020-04-18-2.4561662.611174-0.398938156
2020-04-19-3.6561703.721165-1.9267432010
2020-04-20-4.1912015.072585-1.0188772515
2020-04-21-4.8059355.099728-1.4397523021
\n", "
" ], "text/plain": [ " A B C D F\n", "2020-04-16 0.000000 0.000000 0.743378 5 1\n", "2020-04-17 -0.423923 0.564346 -1.575552 10 3\n", "2020-04-18 -2.456166 2.611174 -0.398938 15 6\n", "2020-04-19 -3.656170 3.721165 -1.926743 20 10\n", "2020-04-20 -4.191201 5.072585 -1.018877 25 15\n", "2020-04-21 -4.805935 5.099728 -1.439752 30 21" ] }, "execution_count": 175, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.apply(np.cumsum) # cumsum 默认按照行累加" ] }, { "cell_type": "code", "execution_count": 178, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
2020-04-160.0000000.0000000.7433785.7433786.743378
2020-04-17-0.4239230.140424-2.1785072.8214934.821493
2020-04-18-2.0322430.0145841.1911986.1911989.191198
2020-04-19-1.200005-0.090013-1.6178183.3821827.382182
2020-04-20-0.5350310.8163891.7242556.72425511.724255
2020-04-21-0.614734-0.587591-1.0084663.9915349.991534
\n", "
" ], "text/plain": [ " A B C D F\n", "2020-04-16 0.000000 0.000000 0.743378 5.743378 6.743378\n", "2020-04-17 -0.423923 0.140424 -2.178507 2.821493 4.821493\n", "2020-04-18 -2.032243 0.014584 1.191198 6.191198 9.191198\n", "2020-04-19 -1.200005 -0.090013 -1.617818 3.382182 7.382182\n", "2020-04-20 -0.535031 0.816389 1.724255 6.724255 11.724255\n", "2020-04-21 -0.614734 -0.587591 -1.008466 3.991534 9.991534" ] }, "execution_count": 178, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.apply(np.cumsum,axis=1) # 指定 cumsum 的 axis 参数,按照列累加" ] }, { "cell_type": "code", "execution_count": 176, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A 2.032243\n", "B 2.046827\n", "C 3.495545\n", "D 0.000000\n", "F 5.000000\n", "dtype: float64" ] }, "execution_count": 176, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.apply(lambda x: x.max() - x.min())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 0x07-3 直方图 Histogramming" ] }, { "cell_type": "code", "execution_count": 179, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 0\n", "1 4\n", "2 5\n", "3 0\n", "4 3\n", "5 2\n", "6 2\n", "7 0\n", "8 5\n", "9 1\n", "dtype: int32" ] }, "execution_count": 179, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = pd.Series(np.random.randint(0, 7, size=10))\n", "s" ] }, { "cell_type": "code", "execution_count": 180, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "0 3\n", "5 2\n", "2 2\n", "4 1\n", "3 1\n", "1 1\n", "dtype: int64" ] }, "execution_count": 180, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 0x07-4 字符串方法 String Methods" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Series 在`str`属性中准备了一组字符串处理方法,可以方便地对数组的每个元素进行操作,如下面的代码片段所示。\n", "\n", "注意`str`中的模式匹配通常默认使用'**正则表达式**(在某些情况下总是使用它们)。" ] }, { "cell_type": "code", "execution_count": 181, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 a\n", "1 b\n", "2 c\n", "3 aaba\n", "4 baca\n", "5 NaN\n", "6 caba\n", "7 dog\n", "8 cat\n", "dtype: object" ] }, "execution_count": 181, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])\n", "s.str.lower()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0x08 合并 Merge" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "pandas 提供了一系列的方法,在 join/merge 操作中,可以轻松地对`Series`, `DataFrame`和`Panel`对象进行各种集合逻辑以及关系代数的操作。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 0x08-1 Concat" ] }, { "cell_type": "code", "execution_count": 182, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0123
0-0.0891430.0875690.218078-0.336815
1-0.6948350.108324-1.882762-0.220210
2-2.069784-0.788424-1.6945950.569263
32.4330360.719851-0.1099350.177864
4-0.8382521.1176760.880839-1.118529
51.7060600.290877-0.907941-0.532450
60.118169-0.496975-0.1904220.783875
7-1.213645-0.489622-0.798443-0.471611
8-0.314598-2.658906-1.1397780.374437
90.229281-1.3723090.996916-1.013462
\n", "
" ], "text/plain": [ " 0 1 2 3\n", "0 -0.089143 0.087569 0.218078 -0.336815\n", "1 -0.694835 0.108324 -1.882762 -0.220210\n", "2 -2.069784 -0.788424 -1.694595 0.569263\n", "3 2.433036 0.719851 -0.109935 0.177864\n", "4 -0.838252 1.117676 0.880839 -1.118529\n", "5 1.706060 0.290877 -0.907941 -0.532450\n", "6 0.118169 -0.496975 -0.190422 0.783875\n", "7 -1.213645 -0.489622 -0.798443 -0.471611\n", "8 -0.314598 -2.658906 -1.139778 0.374437\n", "9 0.229281 -1.372309 0.996916 -1.013462" ] }, "execution_count": 182, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(np.random.randn(10, 4))\n", "df" ] }, { "cell_type": "code", "execution_count": 184, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[ 0 1 2 3\n", " 0 -0.089143 0.087569 0.218078 -0.336815\n", " 1 -0.694835 0.108324 -1.882762 -0.220210\n", " 2 -2.069784 -0.788424 -1.694595 0.569263,\n", " 0 1 2 3\n", " 3 2.433036 0.719851 -0.109935 0.177864\n", " 4 -0.838252 1.117676 0.880839 -1.118529\n", " 5 1.706060 0.290877 -0.907941 -0.532450\n", " 6 0.118169 -0.496975 -0.190422 0.783875,\n", " 0 1 2 3\n", " 7 -1.213645 -0.489622 -0.798443 -0.471611\n", " 8 -0.314598 -2.658906 -1.139778 0.374437\n", " 9 0.229281 -1.372309 0.996916 -1.013462]" ] }, "execution_count": 184, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# break it into pieces\n", "pieces = [df[:3], df[3:7], df[7:]]\n", "pieces" ] }, { "cell_type": "code", "execution_count": 185, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0123
0-0.0891430.0875690.218078-0.336815
1-0.6948350.108324-1.882762-0.220210
2-2.069784-0.788424-1.6945950.569263
32.4330360.719851-0.1099350.177864
4-0.8382521.1176760.880839-1.118529
51.7060600.290877-0.907941-0.532450
60.118169-0.496975-0.1904220.783875
7-1.213645-0.489622-0.798443-0.471611
8-0.314598-2.658906-1.1397780.374437
90.229281-1.3723090.996916-1.013462
\n", "
" ], "text/plain": [ " 0 1 2 3\n", "0 -0.089143 0.087569 0.218078 -0.336815\n", "1 -0.694835 0.108324 -1.882762 -0.220210\n", "2 -2.069784 -0.788424 -1.694595 0.569263\n", "3 2.433036 0.719851 -0.109935 0.177864\n", "4 -0.838252 1.117676 0.880839 -1.118529\n", "5 1.706060 0.290877 -0.907941 -0.532450\n", "6 0.118169 -0.496975 -0.190422 0.783875\n", "7 -1.213645 -0.489622 -0.798443 -0.471611\n", "8 -0.314598 -2.658906 -1.139778 0.374437\n", "9 0.229281 -1.372309 0.996916 -1.013462" ] }, "execution_count": 185, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat(pieces)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 0x08-2 Join" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "类似于 SQL 类型的合并。\n", "\n", "下面是 key 相同的情况。" ] }, { "cell_type": "code", "execution_count": 187, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keylval
0foo1
1foo2
\n", "
" ], "text/plain": [ " key lval\n", "0 foo 1\n", "1 foo 2" ] }, "execution_count": 187, "metadata": {}, "output_type": "execute_result" } ], "source": [ "left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})\n", "left" ] }, { "cell_type": "code", "execution_count": 188, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keyrval
0foo4
1foo5
\n", "
" ], "text/plain": [ " key rval\n", "0 foo 4\n", "1 foo 5" ] }, "execution_count": 188, "metadata": {}, "output_type": "execute_result" } ], "source": [ "right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})\n", "right" ] }, { "cell_type": "code", "execution_count": 189, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keylvalrval
0foo14
1foo15
2foo24
3foo25
\n", "
" ], "text/plain": [ " key lval rval\n", "0 foo 1 4\n", "1 foo 1 5\n", "2 foo 2 4\n", "3 foo 2 5" ] }, "execution_count": 189, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(left, right, on='key')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "另一个例子,key 不同的情况。" ] }, { "cell_type": "code", "execution_count": 190, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keylval
0foo1
1bar2
\n", "
" ], "text/plain": [ " key lval\n", "0 foo 1\n", "1 bar 2" ] }, "execution_count": 190, "metadata": {}, "output_type": "execute_result" } ], "source": [ "left = pd.DataFrame({'key': ['foo', 'bar'], 'lval': [1, 2]})\n", "left" ] }, { "cell_type": "code", "execution_count": 191, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keyrval
0foo4
1bar5
\n", "
" ], "text/plain": [ " key rval\n", "0 foo 4\n", "1 bar 5" ] }, "execution_count": 191, "metadata": {}, "output_type": "execute_result" } ], "source": [ "right = pd.DataFrame({'key': ['foo', 'bar'], 'rval': [4, 5]})\n", "right" ] }, { "cell_type": "code", "execution_count": 192, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keylvalrval
0foo14
1bar25
\n", "
" ], "text/plain": [ " key lval rval\n", "0 foo 1 4\n", "1 bar 2 5" ] }, "execution_count": 192, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(left, right, on='key')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 0x08-3 Append\n", "将一行加入到一个 DataFrame 上" ] }, { "cell_type": "code", "execution_count": 193, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
0-2.727829-1.3821680.9619200.083472
1-0.297131-0.2947230.303267-0.539177
2-0.226735-2.1571701.5594180.102023
30.569927-0.8008550.9185151.630873
40.402999-2.2380522.1816351.950669
51.238971-0.1651590.6882000.793499
61.356265-0.034859-0.0207740.485487
7-1.7933980.9006250.365789-2.089145
\n", "
" ], "text/plain": [ " A B C D\n", "0 -2.727829 -1.382168 0.961920 0.083472\n", "1 -0.297131 -0.294723 0.303267 -0.539177\n", "2 -0.226735 -2.157170 1.559418 0.102023\n", "3 0.569927 -0.800855 0.918515 1.630873\n", "4 0.402999 -2.238052 2.181635 1.950669\n", "5 1.238971 -0.165159 0.688200 0.793499\n", "6 1.356265 -0.034859 -0.020774 0.485487\n", "7 -1.793398 0.900625 0.365789 -2.089145" ] }, "execution_count": 193, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])\n", "df" ] }, { "cell_type": "code", "execution_count": 195, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
0-2.727829-1.3821680.9619200.083472
1-0.297131-0.2947230.303267-0.539177
2-0.226735-2.1571701.5594180.102023
30.569927-0.8008550.9185151.630873
40.402999-2.2380522.1816351.950669
51.238971-0.1651590.6882000.793499
61.356265-0.034859-0.0207740.485487
7-1.7933980.9006250.365789-2.089145
80.569927-0.8008550.9185151.630873
\n", "
" ], "text/plain": [ " A B C D\n", "0 -2.727829 -1.382168 0.961920 0.083472\n", "1 -0.297131 -0.294723 0.303267 -0.539177\n", "2 -0.226735 -2.157170 1.559418 0.102023\n", "3 0.569927 -0.800855 0.918515 1.630873\n", "4 0.402999 -2.238052 2.181635 1.950669\n", "5 1.238971 -0.165159 0.688200 0.793499\n", "6 1.356265 -0.034859 -0.020774 0.485487\n", "7 -1.793398 0.900625 0.365789 -2.089145\n", "8 0.569927 -0.800855 0.918515 1.630873" ] }, "execution_count": 195, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = df.iloc[3]\n", "df.append(s, ignore_index=True) # 忽略 index" ] }, { "cell_type": "code", "execution_count": 197, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
0-2.727829-1.3821680.9619200.083472
1-0.297131-0.2947230.303267-0.539177
2-0.226735-2.1571701.5594180.102023
30.569927-0.8008550.9185151.630873
40.402999-2.2380522.1816351.950669
51.238971-0.1651590.6882000.793499
61.356265-0.034859-0.0207740.485487
7-1.7933980.9006250.365789-2.089145
40.402999-2.2380522.1816351.950669
\n", "
" ], "text/plain": [ " A B C D\n", "0 -2.727829 -1.382168 0.961920 0.083472\n", "1 -0.297131 -0.294723 0.303267 -0.539177\n", "2 -0.226735 -2.157170 1.559418 0.102023\n", "3 0.569927 -0.800855 0.918515 1.630873\n", "4 0.402999 -2.238052 2.181635 1.950669\n", "5 1.238971 -0.165159 0.688200 0.793499\n", "6 1.356265 -0.034859 -0.020774 0.485487\n", "7 -1.793398 0.900625 0.365789 -2.089145\n", "4 0.402999 -2.238052 2.181635 1.950669" ] }, "execution_count": 197, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = df.iloc[4]\n", "df.append(s, ignore_index=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0x09 分组 Grouping" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对于分组(group by),通常有下面几个操作步骤:\n", "- Splitting 按照一些规则将数据分为不同的组\n", "\n", "- Applying 对于每组数据分别执行一个函数\n", "\n", "- Combining 将结果组合到一个数据结构中" ] }, { "cell_type": "code", "execution_count": 199, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
0fooone1.0385862.040014
1barone0.454452-0.553457
2footwo-0.730273-0.207136
3barthree0.4351360.443462
4footwo2.557988-1.831259
5bartwo1.1310840.915332
6fooone1.0781710.037355
7foothree2.0572031.209778
\n", "
" ], "text/plain": [ " A B C D\n", "0 foo one 1.038586 2.040014\n", "1 bar one 0.454452 -0.553457\n", "2 foo two -0.730273 -0.207136\n", "3 bar three 0.435136 0.443462\n", "4 foo two 2.557988 -1.831259\n", "5 bar two 1.131084 0.915332\n", "6 foo one 1.078171 0.037355\n", "7 foo three 2.057203 1.209778" ] }, "execution_count": 199, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',\n", " 'foo', 'bar', 'foo', 'foo'],\n", " 'B' : ['one', 'one', 'two', 'three',\n", " 'two', 'two', 'one', 'three'],\n", " 'C' : np.random.randn(8),\n", " 'D' : np.random.randn(8)})\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "分组并对得到的分组执行`sum`函数。" ] }, { "cell_type": "code", "execution_count": 202, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CD
A
bar-1.0015201.880284
foo1.3651071.459170
\n", "
" ], "text/plain": [ " C D\n", "A \n", "bar -1.001520 1.880284\n", "foo 1.365107 1.459170" ] }, "execution_count": 202, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby('A').sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过多个列进行分组形成一个层次(hierarchical)索引,然后执行函数。" ] }, { "cell_type": "code", "execution_count": 205, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CD
AB
barone0.5988831.667737
three-0.605689-0.531403
two-0.9947150.743951
fooone-0.0902500.694644
three0.7380671.498865
two0.717290-0.734339
\n", "
" ], "text/plain": [ " C D\n", "A B \n", "bar one 0.598883 1.667737\n", " three -0.605689 -0.531403\n", " two -0.994715 0.743951\n", "foo one -0.090250 0.694644\n", " three 0.738067 1.498865\n", " two 0.717290 -0.734339" ] }, "execution_count": 205, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby(['A','B']).sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0x0A 重塑/改变形状 Reshaping" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 0x0A-1 Stack" ] }, { "cell_type": "code", "execution_count": 207, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('bar', 'one'),\n", " ('bar', 'two'),\n", " ('baz', 'one'),\n", " ('baz', 'two'),\n", " ('foo', 'one'),\n", " ('foo', 'two'),\n", " ('qux', 'one'),\n", " ('qux', 'two')]" ] }, "execution_count": 207, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tuples = list(zip(*[['bar', 'bar', 'baz', 'baz',\n", " 'foo', 'foo', 'qux', 'qux'],\n", " ['one', 'two', 'one', 'two',\n", " 'one', 'two', 'one', 'two']]))\n", "tuples" ] }, { "cell_type": "code", "execution_count": 208, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
firstsecond
barone1.402402-0.215913
two-0.305333-0.679614
bazone0.7452050.872718
two0.421718-0.662528
fooone-1.4336280.627898
two2.129267-0.260206
quxone0.498752-0.622814
two-0.3564921.364184
\n", "
" ], "text/plain": [ " A B\n", "first second \n", "bar one 1.402402 -0.215913\n", " two -0.305333 -0.679614\n", "baz one 0.745205 0.872718\n", " two 0.421718 -0.662528\n", "foo one -1.433628 0.627898\n", " two 2.129267 -0.260206\n", "qux one 0.498752 -0.622814\n", " two -0.356492 1.364184" ] }, "execution_count": 208, "metadata": {}, "output_type": "execute_result" } ], "source": [ "index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])\n", "df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])\n", "df" ] }, { "cell_type": "code", "execution_count": 209, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
firstsecond
barone1.402402-0.215913
two-0.305333-0.679614
bazone0.7452050.872718
two0.421718-0.662528
\n", "
" ], "text/plain": [ " A B\n", "first second \n", "bar one 1.402402 -0.215913\n", " two -0.305333 -0.679614\n", "baz one 0.745205 0.872718\n", " two 0.421718 -0.662528" ] }, "execution_count": 209, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2 = df[:4]\n", "df2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`stack()`方法在 DataFrame 列的层次上进行**压缩** " ] }, { "cell_type": "code", "execution_count": 210, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "first second \n", "bar one A 1.402402\n", " B -0.215913\n", " two A -0.305333\n", " B -0.679614\n", "baz one A 0.745205\n", " B 0.872718\n", " two A 0.421718\n", " B -0.662528\n", "dtype: float64" ] }, "execution_count": 210, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stacked = df2.stack()\n", "stacked" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对于一个经过了 stack 的 DataFrame 或者 Series(以 MultiIndex 作为索引),`stack()`的逆运算是`isunstack()`,默认情况下是 unstack 最后一层。 \n", "\n", "就是说,bar、baz是第0级,one、two是第1级,A、B是第2级。" ] }, { "cell_type": "code", "execution_count": 211, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
firstsecond
barone1.402402-0.215913
two-0.305333-0.679614
bazone0.7452050.872718
two0.421718-0.662528
\n", "
" ], "text/plain": [ " A B\n", "first second \n", "bar one 1.402402 -0.215913\n", " two -0.305333 -0.679614\n", "baz one 0.745205 0.872718\n", " two 0.421718 -0.662528" ] }, "execution_count": 211, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stacked.unstack()" ] }, { "cell_type": "code", "execution_count": 212, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
secondonetwo
first
barA1.402402-0.305333
B-0.215913-0.679614
bazA0.7452050.421718
B0.872718-0.662528
\n", "
" ], "text/plain": [ "second one two\n", "first \n", "bar A 1.402402 -0.305333\n", " B -0.215913 -0.679614\n", "baz A 0.745205 0.421718\n", " B 0.872718 -0.662528" ] }, "execution_count": 212, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stacked.unstack(1)" ] }, { "cell_type": "code", "execution_count": 213, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
firstbarbaz
second
oneA1.4024020.745205
B-0.2159130.872718
twoA-0.3053330.421718
B-0.679614-0.662528
\n", "
" ], "text/plain": [ "first bar baz\n", "second \n", "one A 1.402402 0.745205\n", " B -0.215913 0.872718\n", "two A -0.305333 0.421718\n", " B -0.679614 -0.662528" ] }, "execution_count": 213, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stacked.unstack(0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 0x0A-2 数据透视表 Pivot Tables" ] }, { "cell_type": "code", "execution_count": 221, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDE
0oneAfoo0.0726960.305015
1oneBfoo1.428383-1.108178
2twoCfoo1.2394830.001580
3threeAbar-0.9535471.061740
4oneBbar0.7627301.161542
5oneCbar-0.372740-0.480251
6twoAfoo0.765181-1.034218
7threeBfoo-1.8583340.359220
8oneCfoo-0.9528071.067494
9oneAbar0.541013-0.280833
10twoBbar-1.810560-0.829793
11threeCbar-1.049108-0.295998
\n", "
" ], "text/plain": [ " A B C D E\n", "0 one A foo 0.072696 0.305015\n", "1 one B foo 1.428383 -1.108178\n", "2 two C foo 1.239483 0.001580\n", "3 three A bar -0.953547 1.061740\n", "4 one B bar 0.762730 1.161542\n", "5 one C bar -0.372740 -0.480251\n", "6 two A foo 0.765181 -1.034218\n", "7 three B foo -1.858334 0.359220\n", "8 one C foo -0.952807 1.067494\n", "9 one A bar 0.541013 -0.280833\n", "10 two B bar -1.810560 -0.829793\n", "11 three C bar -1.049108 -0.295998" ] }, "execution_count": 221, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 3,\n", " 'B' : ['A', 'B', 'C'] * 4,\n", " 'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2,\n", " 'D' : np.random.randn(12),\n", " 'E' : np.random.randn(12)})\n", "df" ] }, { "cell_type": "code", "execution_count": 222, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cbarfoo
AB
oneA0.5410130.072696
B0.7627301.428383
C-0.372740-0.952807
threeA-0.953547NaN
BNaN-1.858334
C-1.049108NaN
twoANaN0.765181
B-1.810560NaN
CNaN1.239483
\n", "
" ], "text/plain": [ "C bar foo\n", "A B \n", "one A 0.541013 0.072696\n", " B 0.762730 1.428383\n", " C -0.372740 -0.952807\n", "three A -0.953547 NaN\n", " B NaN -1.858334\n", " C -1.049108 NaN\n", "two A NaN 0.765181\n", " B -1.810560 NaN\n", " C NaN 1.239483" ] }, "execution_count": 222, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0x0B 时间序列 Time Series" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandas 在对频率转换进行重新采样时拥有简单、强大且高效的功能(如将按秒采样的数据转换为按5分钟为单位进行采样的数据)。这种操作在金融领域非常常见,但不局限于此。\n", "\n", "*哇,原来还可以这样玩唉(*\n", "\n", "这个在信号处理里面也很常用的呢!" ] }, { "cell_type": "code", "execution_count": 235, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "2020-01-01 00:00:00 13244\n", "2020-01-01 00:01:00 14799\n", "2020-01-01 00:02:00 15489\n", "2020-01-01 00:03:00 3894\n", "Freq: T, dtype: int32" ] }, "execution_count": 235, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rng = pd.date_range('1/1/2020', periods=200, freq='S')\n", "ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)\n", "ts.resample('1Min').sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 时区表示" ] }, { "cell_type": "code", "execution_count": 238, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2020-04-16 0.872043\n", "2020-04-17 -0.305200\n", "2020-04-18 1.681828\n", "2020-04-19 0.163184\n", "2020-04-20 1.415422\n", "Freq: D, dtype: float64" ] }, "execution_count": 238, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rng = pd.date_range('4/16/2020 00:00', periods=5, freq='D')\n", "ts = pd.Series(np.random.randn(len(rng)), rng)\n", "ts" ] }, { "cell_type": "code", "execution_count": 240, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2020-04-16 00:00:00+00:00 0.872043\n", "2020-04-17 00:00:00+00:00 -0.305200\n", "2020-04-18 00:00:00+00:00 1.681828\n", "2020-04-19 00:00:00+00:00 0.163184\n", "2020-04-20 00:00:00+00:00 1.415422\n", "Freq: D, dtype: float64" ] }, "execution_count": 240, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts_utc = ts.tz_localize('UTC')\n", "ts_utc" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 转换到另外一个时区" ] }, { "cell_type": "code", "execution_count": 242, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2020-04-16 08:00:00+08:00 0.872043\n", "2020-04-17 08:00:00+08:00 -0.305200\n", "2020-04-18 08:00:00+08:00 1.681828\n", "2020-04-19 08:00:00+08:00 0.163184\n", "2020-04-20 08:00:00+08:00 1.415422\n", "Freq: D, dtype: float64" ] }, "execution_count": 242, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts_utc.tz_convert('Asia/Shanghai')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 时间跨度转换" ] }, { "cell_type": "code", "execution_count": 251, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2020-01-31 0.259847\n", "2020-02-29 -0.092969\n", "2020-03-31 0.525985\n", "2020-04-30 0.090362\n", "2020-05-31 1.707569\n", "Freq: M, dtype: float64" ] }, "execution_count": 251, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rng = pd.date_range('1/1/2020', periods=5, freq='M')\n", "ts = pd.Series(np.random.randn(len(rng)), index=rng)\n", "ts" ] }, { "cell_type": "code", "execution_count": 252, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2020-01 0.259847\n", "2020-02 -0.092969\n", "2020-03 0.525985\n", "2020-04 0.090362\n", "2020-05 1.707569\n", "Freq: M, dtype: float64" ] }, "execution_count": 252, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ps = ts.to_period()\n", "ps" ] }, { "cell_type": "code", "execution_count": 253, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2020-01-01 0.259847\n", "2020-02-01 -0.092969\n", "2020-03-01 0.525985\n", "2020-04-01 0.090362\n", "2020-05-01 1.707569\n", "Freq: MS, dtype: float64" ] }, "execution_count": 253, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ps.to_timestamp()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "时期和时间戳之间的转换使得可以使用一些方便的算术函数。\n", "\n", "下面这个例子,转换一个每年以11月结束的季度频率为 季度结束后的月末的上午9点。*(有点懵*" ] }, { "cell_type": "code", "execution_count": 256, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1990-03-01 09:00 -1.287411\n", "1990-06-01 09:00 1.744485\n", "1990-09-01 09:00 0.336561\n", "1990-12-01 09:00 -1.206576\n", "1991-03-01 09:00 0.108631\n", "Freq: H, dtype: float64" ] }, "execution_count": 256, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prng = pd.period_range('1990Q1', '2000Q4', freq='Q-NOV')\n", "ts = pd.Series(np.random.randn(len(prng)), prng)\n", "ts.index = (prng.asfreq('M', 'e') + 1).asfreq('H', 's') + 9\n", "ts.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0x0C 类别 Categoricals" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "pandas 可以在 DataFrame 中支持 category 类型的数据。" ] }, { "cell_type": "code", "execution_count": 257, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame({\"id\":[1,2,3,4,5,6], \"raw_grade\":['a', 'b', 'b', 'a', 'a', 'e']})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "将 raw grades 转换为 category 数据类型。" ] }, { "cell_type": "code", "execution_count": 259, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 a\n", "1 b\n", "2 b\n", "3 a\n", "4 a\n", "5 e\n", "Name: grade, dtype: category\n", "Categories (3, object): [a, b, e]" ] }, "execution_count": 259, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"grade\"] = df[\"raw_grade\"].astype(\"category\")\n", "df[\"grade\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "将 category 类型数据重命名为更有意义的名称,利用`Series.cat.categories`方法。" ] }, { "cell_type": "code", "execution_count": 261, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 very good\n", "1 good\n", "2 good\n", "3 very good\n", "4 very good\n", "5 very bad\n", "Name: grade, dtype: category\n", "Categories (3, object): [very good, good, very bad]" ] }, "execution_count": 261, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"grade\"].cat.categories = [\"very good\", \"good\", \"very bad\"]\n", "df[\"grade\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对类别进行重新排序,同时增加缺失的类别。\n", "\n", "`Series.cat`下的方法默认返回一个新的序列。" ] }, { "cell_type": "code", "execution_count": 263, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 very good\n", "1 good\n", "2 good\n", "3 very good\n", "4 very good\n", "5 very bad\n", "Name: grade, dtype: category\n", "Categories (5, object): [very bad, bad, medium, good, very good]" ] }, "execution_count": 263, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"grade\"] = df[\"grade\"].cat.set_categories([\"very bad\", \"bad\", \"medium\", \"good\", \"very good\"])\n", "df[\"grade\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " 排序是按照 category 的顺序进行的,而不是按照词汇顺序(lexical order)。" ] }, { "cell_type": "code", "execution_count": 264, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idraw_gradegrade
56every bad
12bgood
23bgood
01avery good
34avery good
45avery good
\n", "
" ], "text/plain": [ " id raw_grade grade\n", "5 6 e very bad\n", "1 2 b good\n", "2 3 b good\n", "0 1 a very good\n", "3 4 a very good\n", "4 5 a very good" ] }, "execution_count": 264, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values(by=\"grade\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对一个 Category 类型的列进行分组时显示了空的类别。" ] }, { "cell_type": "code", "execution_count": 267, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "grade\n", "very bad 1\n", "bad 0\n", "medium 0\n", "good 2\n", "very good 3\n", "dtype: int64" ] }, "execution_count": 267, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby(\"grade\").size()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0x0D 作图 Plotting " ] }, { "cell_type": "code", "execution_count": 284, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 284, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2020', periods=1000))\n", "ts = ts.cumsum()\n", "ts.plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对于 DataFrame 而言,`plot()`方法是一种将所有带有标签的列进行绘制的简便方法。" ] }, { "cell_type": "code", "execution_count": 295, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 295, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index,\n", " columns=['A', 'B', 'C', 'D'])\n", "# print(df)\n", "df = df.cumsum()\n", "plt.figure()\n", "df.plot()\n", "plt.legend(loc='best')" ] }, { "cell_type": "code", "execution_count": 296, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',\n", " '2020-01-05', '2020-01-06', '2020-01-07', '2020-01-08',\n", " '2020-01-09', '2020-01-10',\n", " ...\n", " '2022-09-17', '2022-09-18', '2022-09-19', '2022-09-20',\n", " '2022-09-21', '2022-09-22', '2022-09-23', '2022-09-24',\n", " '2022-09-25', '2022-09-26'],\n", " dtype='datetime64[ns]', length=1000, freq='D')" ] }, "execution_count": 296, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.index" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0x0E 导入导出数据 Getting Data In/Out " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 0x0E-1 CSV\n", "\n", "**写入 csv 文件**" ] }, { "cell_type": "code", "execution_count": 297, "metadata": {}, "outputs": [], "source": [ "df.to_csv('foo.csv') # 保存在当前目录下" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**从 csv 文件中导入数据**" ] }, { "cell_type": "code", "execution_count": 298, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0ABCD
02020-01-01-1.397481-0.4537221.374079-2.095767
12020-01-02-1.3634180.5292930.178497-2.364989
22020-01-03-2.047267-0.3330200.379978-2.628204
32020-01-04-2.305870-0.145598-0.232491-2.812290
42020-01-05-1.851390-1.378215-1.202399-4.574516
52020-01-06-3.438928-0.779975-1.864979-5.666847
62020-01-07-4.201270-0.827366-0.796513-5.267628
72020-01-08-5.682762-1.009404-0.760801-4.696243
82020-01-09-4.362126-0.768552-0.747517-5.562345
92020-01-10-5.226357-1.7919200.290504-5.214061
102020-01-11-4.429691-2.026951-0.821212-6.621030
112020-01-12-4.222744-2.875169-0.654313-5.926621
122020-01-13-2.413314-3.329878-1.595397-5.585677
132020-01-14-2.769944-3.536045-1.463671-5.098753
142020-01-15-3.599683-4.973067-3.859425-5.823875
152020-01-16-3.486154-4.792330-2.866047-6.312086
162020-01-17-4.232714-5.082053-3.572924-8.478300
172020-01-18-5.346857-5.787422-4.313125-8.595854
182020-01-19-5.720494-5.620498-3.699862-9.678113
192020-01-20-5.264735-4.938944-2.354040-8.942524
202020-01-21-5.407854-5.379811-2.284447-8.068545
212020-01-22-5.793401-5.501279-2.254013-7.997644
222020-01-23-6.796539-4.692782-2.330458-7.449650
232020-01-24-7.502072-4.085084-1.810495-6.540544
242020-01-25-7.639024-3.7914161.214301-7.599166
252020-01-26-7.783544-2.1809181.628560-7.928116
262020-01-27-7.673699-3.4858880.640970-8.124872
272020-01-28-7.435098-4.480212-0.409425-7.943383
282020-01-29-6.843557-5.069680-1.650871-7.311741
292020-01-30-7.647267-4.115332-1.558887-6.308304
..................
9702022-08-2817.157914-23.306973-12.461653-2.478731
9712022-08-2918.207251-23.725280-12.912440-2.664828
9722022-08-3017.968302-21.485150-15.044877-4.034060
9732022-08-3118.933869-21.587237-16.046081-4.014128
9742022-09-0118.337284-21.451739-15.028398-4.147177
9752022-09-0218.783912-21.096423-15.506137-3.858413
9762022-09-0318.828378-19.514168-16.924864-2.559397
9772022-09-0418.570511-21.482747-17.147155-4.267082
9782022-09-0517.212119-22.331837-16.496095-5.990857
9792022-09-0615.726498-23.219830-19.321023-5.281962
9802022-09-0716.053999-22.681168-19.139536-5.587482
9812022-09-0817.335456-23.320514-21.271891-4.048170
9822022-09-0916.925567-24.175782-22.318101-4.890968
9832022-09-1018.652048-25.436089-22.213175-6.330027
9842022-09-1119.535978-25.673818-23.064392-5.673334
9852022-09-1219.632355-26.369119-22.953900-3.463010
9862022-09-1318.792587-25.430236-23.672206-2.292810
9872022-09-1421.200064-26.299390-23.567706-2.753986
9882022-09-1522.890536-27.813985-23.938164-3.195772
9892022-09-1623.138447-25.855344-24.390078-3.612660
9902022-09-1723.163567-26.157774-24.309178-3.155928
9912022-09-1820.973996-27.319631-22.948785-4.487101
9922022-09-1921.090756-26.712847-21.722990-4.110810
9932022-09-2021.848391-25.018472-21.850579-4.360523
9942022-09-2122.898217-26.005364-20.914269-5.357187
9952022-09-2221.978310-25.001244-20.881626-5.606849
9962022-09-2324.132628-25.692639-20.310265-6.258977
9972022-09-2423.777794-25.485527-21.305882-5.330284
9982022-09-2525.105611-25.485135-22.407657-6.600228
9992022-09-2625.207099-25.512208-23.434955-7.275999
\n", "

1000 rows × 5 columns

\n", "
" ], "text/plain": [ " Unnamed: 0 A B C D\n", "0 2020-01-01 -1.397481 -0.453722 1.374079 -2.095767\n", "1 2020-01-02 -1.363418 0.529293 0.178497 -2.364989\n", "2 2020-01-03 -2.047267 -0.333020 0.379978 -2.628204\n", "3 2020-01-04 -2.305870 -0.145598 -0.232491 -2.812290\n", "4 2020-01-05 -1.851390 -1.378215 -1.202399 -4.574516\n", "5 2020-01-06 -3.438928 -0.779975 -1.864979 -5.666847\n", "6 2020-01-07 -4.201270 -0.827366 -0.796513 -5.267628\n", "7 2020-01-08 -5.682762 -1.009404 -0.760801 -4.696243\n", "8 2020-01-09 -4.362126 -0.768552 -0.747517 -5.562345\n", "9 2020-01-10 -5.226357 -1.791920 0.290504 -5.214061\n", "10 2020-01-11 -4.429691 -2.026951 -0.821212 -6.621030\n", "11 2020-01-12 -4.222744 -2.875169 -0.654313 -5.926621\n", "12 2020-01-13 -2.413314 -3.329878 -1.595397 -5.585677\n", "13 2020-01-14 -2.769944 -3.536045 -1.463671 -5.098753\n", "14 2020-01-15 -3.599683 -4.973067 -3.859425 -5.823875\n", "15 2020-01-16 -3.486154 -4.792330 -2.866047 -6.312086\n", "16 2020-01-17 -4.232714 -5.082053 -3.572924 -8.478300\n", "17 2020-01-18 -5.346857 -5.787422 -4.313125 -8.595854\n", "18 2020-01-19 -5.720494 -5.620498 -3.699862 -9.678113\n", "19 2020-01-20 -5.264735 -4.938944 -2.354040 -8.942524\n", "20 2020-01-21 -5.407854 -5.379811 -2.284447 -8.068545\n", "21 2020-01-22 -5.793401 -5.501279 -2.254013 -7.997644\n", "22 2020-01-23 -6.796539 -4.692782 -2.330458 -7.449650\n", "23 2020-01-24 -7.502072 -4.085084 -1.810495 -6.540544\n", "24 2020-01-25 -7.639024 -3.791416 1.214301 -7.599166\n", "25 2020-01-26 -7.783544 -2.180918 1.628560 -7.928116\n", "26 2020-01-27 -7.673699 -3.485888 0.640970 -8.124872\n", "27 2020-01-28 -7.435098 -4.480212 -0.409425 -7.943383\n", "28 2020-01-29 -6.843557 -5.069680 -1.650871 -7.311741\n", "29 2020-01-30 -7.647267 -4.115332 -1.558887 -6.308304\n", ".. ... ... ... ... ...\n", "970 2022-08-28 17.157914 -23.306973 -12.461653 -2.478731\n", "971 2022-08-29 18.207251 -23.725280 -12.912440 -2.664828\n", "972 2022-08-30 17.968302 -21.485150 -15.044877 -4.034060\n", "973 2022-08-31 18.933869 -21.587237 -16.046081 -4.014128\n", "974 2022-09-01 18.337284 -21.451739 -15.028398 -4.147177\n", "975 2022-09-02 18.783912 -21.096423 -15.506137 -3.858413\n", "976 2022-09-03 18.828378 -19.514168 -16.924864 -2.559397\n", "977 2022-09-04 18.570511 -21.482747 -17.147155 -4.267082\n", "978 2022-09-05 17.212119 -22.331837 -16.496095 -5.990857\n", "979 2022-09-06 15.726498 -23.219830 -19.321023 -5.281962\n", "980 2022-09-07 16.053999 -22.681168 -19.139536 -5.587482\n", "981 2022-09-08 17.335456 -23.320514 -21.271891 -4.048170\n", "982 2022-09-09 16.925567 -24.175782 -22.318101 -4.890968\n", "983 2022-09-10 18.652048 -25.436089 -22.213175 -6.330027\n", "984 2022-09-11 19.535978 -25.673818 -23.064392 -5.673334\n", "985 2022-09-12 19.632355 -26.369119 -22.953900 -3.463010\n", "986 2022-09-13 18.792587 -25.430236 -23.672206 -2.292810\n", "987 2022-09-14 21.200064 -26.299390 -23.567706 -2.753986\n", "988 2022-09-15 22.890536 -27.813985 -23.938164 -3.195772\n", "989 2022-09-16 23.138447 -25.855344 -24.390078 -3.612660\n", "990 2022-09-17 23.163567 -26.157774 -24.309178 -3.155928\n", "991 2022-09-18 20.973996 -27.319631 -22.948785 -4.487101\n", "992 2022-09-19 21.090756 -26.712847 -21.722990 -4.110810\n", "993 2022-09-20 21.848391 -25.018472 -21.850579 -4.360523\n", "994 2022-09-21 22.898217 -26.005364 -20.914269 -5.357187\n", "995 2022-09-22 21.978310 -25.001244 -20.881626 -5.606849\n", "996 2022-09-23 24.132628 -25.692639 -20.310265 -6.258977\n", "997 2022-09-24 23.777794 -25.485527 -21.305882 -5.330284\n", "998 2022-09-25 25.105611 -25.485135 -22.407657 -6.600228\n", "999 2022-09-26 25.207099 -25.512208 -23.434955 -7.275999\n", "\n", "[1000 rows x 5 columns]" ] }, "execution_count": 298, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.read_csv('foo.csv')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 0x0E-2 HDF5\n", "\n", "**写入 HDF5 存储**" ] }, { "cell_type": "code", "execution_count": 299, "metadata": {}, "outputs": [], "source": [ "df.to_hdf('foo.h5','df')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**从 HDF5 存储中读取数据**" ] }, { "cell_type": "code", "execution_count": 300, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2020-01-01-1.397481-0.4537221.374079-2.095767
2020-01-02-1.3634180.5292930.178497-2.364989
2020-01-03-2.047267-0.3330200.379978-2.628204
2020-01-04-2.305870-0.145598-0.232491-2.812290
2020-01-05-1.851390-1.378215-1.202399-4.574516
2020-01-06-3.438928-0.779975-1.864979-5.666847
2020-01-07-4.201270-0.827366-0.796513-5.267628
2020-01-08-5.682762-1.009404-0.760801-4.696243
2020-01-09-4.362126-0.768552-0.747517-5.562345
2020-01-10-5.226357-1.7919200.290504-5.214061
2020-01-11-4.429691-2.026951-0.821212-6.621030
2020-01-12-4.222744-2.875169-0.654313-5.926621
2020-01-13-2.413314-3.329878-1.595397-5.585677
2020-01-14-2.769944-3.536045-1.463671-5.098753
2020-01-15-3.599683-4.973067-3.859425-5.823875
2020-01-16-3.486154-4.792330-2.866047-6.312086
2020-01-17-4.232714-5.082053-3.572924-8.478300
2020-01-18-5.346857-5.787422-4.313125-8.595854
2020-01-19-5.720494-5.620498-3.699862-9.678113
2020-01-20-5.264735-4.938944-2.354040-8.942524
2020-01-21-5.407854-5.379811-2.284447-8.068545
2020-01-22-5.793401-5.501279-2.254013-7.997644
2020-01-23-6.796539-4.692782-2.330458-7.449650
2020-01-24-7.502072-4.085084-1.810495-6.540544
2020-01-25-7.639024-3.7914161.214301-7.599166
2020-01-26-7.783544-2.1809181.628560-7.928116
2020-01-27-7.673699-3.4858880.640970-8.124872
2020-01-28-7.435098-4.480212-0.409425-7.943383
2020-01-29-6.843557-5.069680-1.650871-7.311741
2020-01-30-7.647267-4.115332-1.558887-6.308304
...............
2022-08-2817.157914-23.306973-12.461653-2.478731
2022-08-2918.207251-23.725280-12.912440-2.664828
2022-08-3017.968302-21.485150-15.044877-4.034060
2022-08-3118.933869-21.587237-16.046081-4.014128
2022-09-0118.337284-21.451739-15.028398-4.147177
2022-09-0218.783912-21.096423-15.506137-3.858413
2022-09-0318.828378-19.514168-16.924864-2.559397
2022-09-0418.570511-21.482747-17.147155-4.267082
2022-09-0517.212119-22.331837-16.496095-5.990857
2022-09-0615.726498-23.219830-19.321023-5.281962
2022-09-0716.053999-22.681168-19.139536-5.587482
2022-09-0817.335456-23.320514-21.271891-4.048170
2022-09-0916.925567-24.175782-22.318101-4.890968
2022-09-1018.652048-25.436089-22.213175-6.330027
2022-09-1119.535978-25.673818-23.064392-5.673334
2022-09-1219.632355-26.369119-22.953900-3.463010
2022-09-1318.792587-25.430236-23.672206-2.292810
2022-09-1421.200064-26.299390-23.567706-2.753986
2022-09-1522.890536-27.813985-23.938164-3.195772
2022-09-1623.138447-25.855344-24.390078-3.612660
2022-09-1723.163567-26.157774-24.309178-3.155928
2022-09-1820.973996-27.319631-22.948785-4.487101
2022-09-1921.090756-26.712847-21.722990-4.110810
2022-09-2021.848391-25.018472-21.850579-4.360523
2022-09-2122.898217-26.005364-20.914269-5.357187
2022-09-2221.978310-25.001244-20.881626-5.606849
2022-09-2324.132628-25.692639-20.310265-6.258977
2022-09-2423.777794-25.485527-21.305882-5.330284
2022-09-2525.105611-25.485135-22.407657-6.600228
2022-09-2625.207099-25.512208-23.434955-7.275999
\n", "

1000 rows × 4 columns

\n", "
" ], "text/plain": [ " A B C D\n", "2020-01-01 -1.397481 -0.453722 1.374079 -2.095767\n", "2020-01-02 -1.363418 0.529293 0.178497 -2.364989\n", "2020-01-03 -2.047267 -0.333020 0.379978 -2.628204\n", "2020-01-04 -2.305870 -0.145598 -0.232491 -2.812290\n", "2020-01-05 -1.851390 -1.378215 -1.202399 -4.574516\n", "2020-01-06 -3.438928 -0.779975 -1.864979 -5.666847\n", "2020-01-07 -4.201270 -0.827366 -0.796513 -5.267628\n", "2020-01-08 -5.682762 -1.009404 -0.760801 -4.696243\n", "2020-01-09 -4.362126 -0.768552 -0.747517 -5.562345\n", "2020-01-10 -5.226357 -1.791920 0.290504 -5.214061\n", "2020-01-11 -4.429691 -2.026951 -0.821212 -6.621030\n", "2020-01-12 -4.222744 -2.875169 -0.654313 -5.926621\n", "2020-01-13 -2.413314 -3.329878 -1.595397 -5.585677\n", "2020-01-14 -2.769944 -3.536045 -1.463671 -5.098753\n", "2020-01-15 -3.599683 -4.973067 -3.859425 -5.823875\n", "2020-01-16 -3.486154 -4.792330 -2.866047 -6.312086\n", "2020-01-17 -4.232714 -5.082053 -3.572924 -8.478300\n", "2020-01-18 -5.346857 -5.787422 -4.313125 -8.595854\n", "2020-01-19 -5.720494 -5.620498 -3.699862 -9.678113\n", "2020-01-20 -5.264735 -4.938944 -2.354040 -8.942524\n", "2020-01-21 -5.407854 -5.379811 -2.284447 -8.068545\n", "2020-01-22 -5.793401 -5.501279 -2.254013 -7.997644\n", "2020-01-23 -6.796539 -4.692782 -2.330458 -7.449650\n", "2020-01-24 -7.502072 -4.085084 -1.810495 -6.540544\n", "2020-01-25 -7.639024 -3.791416 1.214301 -7.599166\n", "2020-01-26 -7.783544 -2.180918 1.628560 -7.928116\n", "2020-01-27 -7.673699 -3.485888 0.640970 -8.124872\n", "2020-01-28 -7.435098 -4.480212 -0.409425 -7.943383\n", "2020-01-29 -6.843557 -5.069680 -1.650871 -7.311741\n", "2020-01-30 -7.647267 -4.115332 -1.558887 -6.308304\n", "... ... ... ... ...\n", "2022-08-28 17.157914 -23.306973 -12.461653 -2.478731\n", "2022-08-29 18.207251 -23.725280 -12.912440 -2.664828\n", "2022-08-30 17.968302 -21.485150 -15.044877 -4.034060\n", "2022-08-31 18.933869 -21.587237 -16.046081 -4.014128\n", "2022-09-01 18.337284 -21.451739 -15.028398 -4.147177\n", "2022-09-02 18.783912 -21.096423 -15.506137 -3.858413\n", "2022-09-03 18.828378 -19.514168 -16.924864 -2.559397\n", "2022-09-04 18.570511 -21.482747 -17.147155 -4.267082\n", "2022-09-05 17.212119 -22.331837 -16.496095 -5.990857\n", "2022-09-06 15.726498 -23.219830 -19.321023 -5.281962\n", "2022-09-07 16.053999 -22.681168 -19.139536 -5.587482\n", "2022-09-08 17.335456 -23.320514 -21.271891 -4.048170\n", "2022-09-09 16.925567 -24.175782 -22.318101 -4.890968\n", "2022-09-10 18.652048 -25.436089 -22.213175 -6.330027\n", "2022-09-11 19.535978 -25.673818 -23.064392 -5.673334\n", "2022-09-12 19.632355 -26.369119 -22.953900 -3.463010\n", "2022-09-13 18.792587 -25.430236 -23.672206 -2.292810\n", "2022-09-14 21.200064 -26.299390 -23.567706 -2.753986\n", "2022-09-15 22.890536 -27.813985 -23.938164 -3.195772\n", "2022-09-16 23.138447 -25.855344 -24.390078 -3.612660\n", "2022-09-17 23.163567 -26.157774 -24.309178 -3.155928\n", "2022-09-18 20.973996 -27.319631 -22.948785 -4.487101\n", "2022-09-19 21.090756 -26.712847 -21.722990 -4.110810\n", "2022-09-20 21.848391 -25.018472 -21.850579 -4.360523\n", "2022-09-21 22.898217 -26.005364 -20.914269 -5.357187\n", "2022-09-22 21.978310 -25.001244 -20.881626 -5.606849\n", "2022-09-23 24.132628 -25.692639 -20.310265 -6.258977\n", "2022-09-24 23.777794 -25.485527 -21.305882 -5.330284\n", "2022-09-25 25.105611 -25.485135 -22.407657 -6.600228\n", "2022-09-26 25.207099 -25.512208 -23.434955 -7.275999\n", "\n", "[1000 rows x 4 columns]" ] }, "execution_count": 300, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.read_hdf('foo.h5','df')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 0x0E-3 Excel\n", "\n", "看网上说,相对于 xlwt、xlrd 之类的库,用 pandas 来对 excel 进行**数据处理和分析**挺不错的,正好最近也想试试呢。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**写入 Excel**" ] }, { "cell_type": "code", "execution_count": 301, "metadata": {}, "outputs": [], "source": [ "df.to_excel('foo.xlsx', sheet_name='Sheet1')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**从 excel 中读取数据**" ] }, { "cell_type": "code", "execution_count": 302, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0ABCD
02020-01-01-1.397481-0.4537221.374079-2.095767
12020-01-02-1.3634180.5292930.178497-2.364989
22020-01-03-2.047267-0.3330200.379978-2.628204
32020-01-04-2.305870-0.145598-0.232491-2.812290
42020-01-05-1.851390-1.378215-1.202399-4.574516
52020-01-06-3.438928-0.779975-1.864979-5.666847
62020-01-07-4.201270-0.827366-0.796513-5.267628
72020-01-08-5.682762-1.009404-0.760801-4.696243
82020-01-09-4.362126-0.768552-0.747517-5.562345
92020-01-10-5.226357-1.7919200.290504-5.214061
102020-01-11-4.429691-2.026951-0.821212-6.621030
112020-01-12-4.222744-2.875169-0.654313-5.926621
122020-01-13-2.413314-3.329878-1.595397-5.585677
132020-01-14-2.769944-3.536045-1.463671-5.098753
142020-01-15-3.599683-4.973067-3.859425-5.823875
152020-01-16-3.486154-4.792330-2.866047-6.312086
162020-01-17-4.232714-5.082053-3.572924-8.478300
172020-01-18-5.346857-5.787422-4.313125-8.595854
182020-01-19-5.720494-5.620498-3.699862-9.678113
192020-01-20-5.264735-4.938944-2.354040-8.942524
202020-01-21-5.407854-5.379811-2.284447-8.068545
212020-01-22-5.793401-5.501279-2.254013-7.997644
222020-01-23-6.796539-4.692782-2.330458-7.449650
232020-01-24-7.502072-4.085084-1.810495-6.540544
242020-01-25-7.639024-3.7914161.214301-7.599166
252020-01-26-7.783544-2.1809181.628560-7.928116
262020-01-27-7.673699-3.4858880.640970-8.124872
272020-01-28-7.435098-4.480212-0.409425-7.943383
282020-01-29-6.843557-5.069680-1.650871-7.311741
292020-01-30-7.647267-4.115332-1.558887-6.308304
..................
9702022-08-2817.157914-23.306973-12.461653-2.478731
9712022-08-2918.207251-23.725280-12.912440-2.664828
9722022-08-3017.968302-21.485150-15.044877-4.034060
9732022-08-3118.933869-21.587237-16.046081-4.014128
9742022-09-0118.337284-21.451739-15.028398-4.147177
9752022-09-0218.783912-21.096423-15.506137-3.858413
9762022-09-0318.828378-19.514168-16.924864-2.559397
9772022-09-0418.570511-21.482747-17.147155-4.267082
9782022-09-0517.212119-22.331837-16.496095-5.990857
9792022-09-0615.726498-23.219830-19.321023-5.281962
9802022-09-0716.053999-22.681168-19.139536-5.587482
9812022-09-0817.335456-23.320514-21.271891-4.048170
9822022-09-0916.925567-24.175782-22.318101-4.890968
9832022-09-1018.652048-25.436089-22.213175-6.330027
9842022-09-1119.535978-25.673818-23.064392-5.673334
9852022-09-1219.632355-26.369119-22.953900-3.463010
9862022-09-1318.792587-25.430236-23.672206-2.292810
9872022-09-1421.200064-26.299390-23.567706-2.753986
9882022-09-1522.890536-27.813985-23.938164-3.195772
9892022-09-1623.138447-25.855344-24.390078-3.612660
9902022-09-1723.163567-26.157774-24.309178-3.155928
9912022-09-1820.973996-27.319631-22.948785-4.487101
9922022-09-1921.090756-26.712847-21.722990-4.110810
9932022-09-2021.848391-25.018472-21.850579-4.360523
9942022-09-2122.898217-26.005364-20.914269-5.357187
9952022-09-2221.978310-25.001244-20.881626-5.606849
9962022-09-2324.132628-25.692639-20.310265-6.258977
9972022-09-2423.777794-25.485527-21.305882-5.330284
9982022-09-2525.105611-25.485135-22.407657-6.600228
9992022-09-2625.207099-25.512208-23.434955-7.275999
\n", "

1000 rows × 5 columns

\n", "
" ], "text/plain": [ " Unnamed: 0 A B C D\n", "0 2020-01-01 -1.397481 -0.453722 1.374079 -2.095767\n", "1 2020-01-02 -1.363418 0.529293 0.178497 -2.364989\n", "2 2020-01-03 -2.047267 -0.333020 0.379978 -2.628204\n", "3 2020-01-04 -2.305870 -0.145598 -0.232491 -2.812290\n", "4 2020-01-05 -1.851390 -1.378215 -1.202399 -4.574516\n", "5 2020-01-06 -3.438928 -0.779975 -1.864979 -5.666847\n", "6 2020-01-07 -4.201270 -0.827366 -0.796513 -5.267628\n", "7 2020-01-08 -5.682762 -1.009404 -0.760801 -4.696243\n", "8 2020-01-09 -4.362126 -0.768552 -0.747517 -5.562345\n", "9 2020-01-10 -5.226357 -1.791920 0.290504 -5.214061\n", "10 2020-01-11 -4.429691 -2.026951 -0.821212 -6.621030\n", "11 2020-01-12 -4.222744 -2.875169 -0.654313 -5.926621\n", "12 2020-01-13 -2.413314 -3.329878 -1.595397 -5.585677\n", "13 2020-01-14 -2.769944 -3.536045 -1.463671 -5.098753\n", "14 2020-01-15 -3.599683 -4.973067 -3.859425 -5.823875\n", "15 2020-01-16 -3.486154 -4.792330 -2.866047 -6.312086\n", "16 2020-01-17 -4.232714 -5.082053 -3.572924 -8.478300\n", "17 2020-01-18 -5.346857 -5.787422 -4.313125 -8.595854\n", "18 2020-01-19 -5.720494 -5.620498 -3.699862 -9.678113\n", "19 2020-01-20 -5.264735 -4.938944 -2.354040 -8.942524\n", "20 2020-01-21 -5.407854 -5.379811 -2.284447 -8.068545\n", "21 2020-01-22 -5.793401 -5.501279 -2.254013 -7.997644\n", "22 2020-01-23 -6.796539 -4.692782 -2.330458 -7.449650\n", "23 2020-01-24 -7.502072 -4.085084 -1.810495 -6.540544\n", "24 2020-01-25 -7.639024 -3.791416 1.214301 -7.599166\n", "25 2020-01-26 -7.783544 -2.180918 1.628560 -7.928116\n", "26 2020-01-27 -7.673699 -3.485888 0.640970 -8.124872\n", "27 2020-01-28 -7.435098 -4.480212 -0.409425 -7.943383\n", "28 2020-01-29 -6.843557 -5.069680 -1.650871 -7.311741\n", "29 2020-01-30 -7.647267 -4.115332 -1.558887 -6.308304\n", ".. ... ... ... ... ...\n", "970 2022-08-28 17.157914 -23.306973 -12.461653 -2.478731\n", "971 2022-08-29 18.207251 -23.725280 -12.912440 -2.664828\n", "972 2022-08-30 17.968302 -21.485150 -15.044877 -4.034060\n", "973 2022-08-31 18.933869 -21.587237 -16.046081 -4.014128\n", "974 2022-09-01 18.337284 -21.451739 -15.028398 -4.147177\n", "975 2022-09-02 18.783912 -21.096423 -15.506137 -3.858413\n", "976 2022-09-03 18.828378 -19.514168 -16.924864 -2.559397\n", "977 2022-09-04 18.570511 -21.482747 -17.147155 -4.267082\n", "978 2022-09-05 17.212119 -22.331837 -16.496095 -5.990857\n", "979 2022-09-06 15.726498 -23.219830 -19.321023 -5.281962\n", "980 2022-09-07 16.053999 -22.681168 -19.139536 -5.587482\n", "981 2022-09-08 17.335456 -23.320514 -21.271891 -4.048170\n", "982 2022-09-09 16.925567 -24.175782 -22.318101 -4.890968\n", "983 2022-09-10 18.652048 -25.436089 -22.213175 -6.330027\n", "984 2022-09-11 19.535978 -25.673818 -23.064392 -5.673334\n", "985 2022-09-12 19.632355 -26.369119 -22.953900 -3.463010\n", "986 2022-09-13 18.792587 -25.430236 -23.672206 -2.292810\n", "987 2022-09-14 21.200064 -26.299390 -23.567706 -2.753986\n", "988 2022-09-15 22.890536 -27.813985 -23.938164 -3.195772\n", "989 2022-09-16 23.138447 -25.855344 -24.390078 -3.612660\n", "990 2022-09-17 23.163567 -26.157774 -24.309178 -3.155928\n", "991 2022-09-18 20.973996 -27.319631 -22.948785 -4.487101\n", "992 2022-09-19 21.090756 -26.712847 -21.722990 -4.110810\n", "993 2022-09-20 21.848391 -25.018472 -21.850579 -4.360523\n", "994 2022-09-21 22.898217 -26.005364 -20.914269 -5.357187\n", "995 2022-09-22 21.978310 -25.001244 -20.881626 -5.606849\n", "996 2022-09-23 24.132628 -25.692639 -20.310265 -6.258977\n", "997 2022-09-24 23.777794 -25.485527 -21.305882 -5.330284\n", "998 2022-09-25 25.105611 -25.485135 -22.407657 -6.600228\n", "999 2022-09-26 25.207099 -25.512208 -23.434955 -7.275999\n", "\n", "[1000 rows x 5 columns]" ] }, "execution_count": 302, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0x0F 陷阱(坑) Gotchas " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "如果你在运行中看到例如下面的异常。" ] }, { "cell_type": "code", "execution_count": 304, "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mif\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mSeries\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;32mFalse\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;32mTrue\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;32mFalse\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"I was true\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mD:\\Programs\\Anaconda\\lib\\site-packages\\pandas\\core\\generic.py\u001b[0m in \u001b[0;36m__nonzero__\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 1476\u001b[0m raise ValueError(\"The truth value of a {0} is ambiguous. \"\n\u001b[0;32m 1477\u001b[0m \u001b[1;34m\"Use a.empty, a.bool(), a.item(), a.any() or a.all().\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1478\u001b[1;33m .format(self.__class__.__name__))\n\u001b[0m\u001b[0;32m 1479\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1480\u001b[0m \u001b[0m__bool__\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m__nonzero__\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mValueError\u001b[0m: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()." ] } ], "source": [ "if pd.Series([False, True, False]):\n", " print(\"I was true\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "可以参考 [Comparisons](https://pandas.pydata.org/pandas-docs/version/0.22.0/basics.html#basics-compare) 这里来寻求解释和下一步的方案。\n", "\n", "也可以参考 [Comparisons](https://pandas.pydata.org/pandas-docs/version/0.22.0/gotchas.html#gotchas)。\n", "\n", "*(上面都是官方的文档地址)*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**官方文档的内容到这里就结束啦!**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0x10 小结\n", "\n", "**关于选取:**\n", "\n", "- 选择**整行/整列**,或**多个整行/多个整列**的数据,可以用`df[]`、`df.loc[]`、`df.iloc[]`这三种用法。\n", "- **区域选取**,分为**标签索引**和**整数索引**\n", " - 标签索引:`df.loc[]`\n", " - 整数索引:`df.iloc[]`\n", "- **选取单元格**:`df.at[]`、`df.iat[]`、`df.loc[]`、`df.iloc[]` 都可以,要注意参数。`df[]`不行!\n", "- 关于选取的返回值:\n", " - 返回值包括**单行多列**或**多行单列**时,返回值为 Series 对象\n", " - 返回值包括**多行多列**时,返回值为 DataFrame 对象\n", " - 返回值仅为一个单元格(单行单列)时,返回值为(可能是 numpy 的)基本数据类型,例如 str, float64, int64 等\n", " - `df[]`因为不能精确到单元格,所以返回值一定 DataFrame 或 Series 对象\n", "- 当使用 DataFrame 的默认索引(整数索引)时,整数索引即为标签索引。\n", "\n", "\n", "\n", "其实 pandas 还有很多有用的 API 这里面还没介绍,后面有空再慢慢了解呢。\n", "\n", "做项目的时候看看别人做过的实例,再深入看看相关的 API 好了。\n", "\n", "大概就这些内容了吧。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0xFF References & Extensive Reading" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[官方的 10 Minutes to pandas](https://pandas.pydata.org/pandas-docs/version/0.22.0/10min.html)\n", "\n", "[python数据分析之pandas数据选取:df[\\] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]](https://www.cnblogs.com/chenhuabin/p/10485549.html)\n", "\n", "[学习python中的pandas有没有好的教程推荐?](https://www.zhihu.com/question/56310477/answer/873227129)\n", "\n", "[从Excel到Python:最常用的36个Pandas函数!](https://zhuanlan.zhihu.com/p/97617276)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Copyright" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "采用 [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh) 许可协议。\n", "\n", "Copyright © 2020 [MiaoTony](https://miaotony.xyz)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.7.3 64-bit ('base': conda)", "language": "python", "name": "python37364bitbaseconda1420ac661baf4db4b7b2e9f2fc5b1c9a" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" } }, "nbformat": 4, "nbformat_minor": 2 }