{
"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",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" -0.228084 \n",
" 0.712521 \n",
" 0.743378 \n",
" 0.526823 \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" 0.564346 \n",
" -2.318931 \n",
" 0.080931 \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" 2.046827 \n",
" 1.176614 \n",
" -0.365556 \n",
" \n",
" \n",
" 2020-04-19 \n",
" -1.200005 \n",
" 1.109991 \n",
" -1.527804 \n",
" 1.068642 \n",
" \n",
" \n",
" 2020-04-20 \n",
" -0.535031 \n",
" 1.351420 \n",
" 0.907865 \n",
" -1.074013 \n",
" \n",
" \n",
" 2020-04-21 \n",
" -0.614734 \n",
" 0.027143 \n",
" -0.420875 \n",
" -0.333819 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" E \n",
" F \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 1.0 \n",
" 2020-04-16 18:38:00 \n",
" 1.0 \n",
" 3 \n",
" test \n",
" foo \n",
" \n",
" \n",
" 1 \n",
" 1.0 \n",
" 2020-04-16 18:38:00 \n",
" 1.0 \n",
" 3 \n",
" train \n",
" foo \n",
" \n",
" \n",
" 2 \n",
" 1.0 \n",
" 2020-04-16 18:38:00 \n",
" 1.0 \n",
" 3 \n",
" test \n",
" foo \n",
" \n",
" \n",
" 3 \n",
" 1.0 \n",
" 2020-04-16 18:38:00 \n",
" 1.0 \n",
" 3 \n",
" train \n",
" foo \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" -0.228084 \n",
" 0.712521 \n",
" 0.743378 \n",
" 0.526823 \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" 0.564346 \n",
" -2.318931 \n",
" 0.080931 \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" 2.046827 \n",
" 1.176614 \n",
" -0.365556 \n",
" \n",
" \n",
" 2020-04-19 \n",
" -1.200005 \n",
" 1.109991 \n",
" -1.527804 \n",
" 1.068642 \n",
" \n",
" \n",
" 2020-04-20 \n",
" -0.535031 \n",
" 1.351420 \n",
" 0.907865 \n",
" -1.074013 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" -0.228084 \n",
" 0.712521 \n",
" 0.743378 \n",
" 0.526823 \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" 0.564346 \n",
" -2.318931 \n",
" 0.080931 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-19 \n",
" -1.200005 \n",
" 1.109991 \n",
" -1.527804 \n",
" 1.068642 \n",
" \n",
" \n",
" 2020-04-20 \n",
" -0.535031 \n",
" 1.351420 \n",
" 0.907865 \n",
" -1.074013 \n",
" \n",
" \n",
" 2020-04-21 \n",
" -0.614734 \n",
" 0.027143 \n",
" -0.420875 \n",
" -0.333819 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" -0.228084 \n",
" 0.712521 \n",
" 0.743378 \n",
" 0.526823 \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" 0.564346 \n",
" -2.318931 \n",
" 0.080931 \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" 2.046827 \n",
" 1.176614 \n",
" -0.365556 \n",
" \n",
" \n",
" 2020-04-19 \n",
" -1.200005 \n",
" 1.109991 \n",
" -1.527804 \n",
" 1.068642 \n",
" \n",
" \n",
" 2020-04-20 \n",
" -0.535031 \n",
" 1.351420 \n",
" 0.907865 \n",
" -1.074013 \n",
" \n",
" \n",
" 2020-04-21 \n",
" -0.614734 \n",
" 0.027143 \n",
" -0.420875 \n",
" -0.333819 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" count \n",
" 6.000000 \n",
" 6.000000 \n",
" 6.000000 \n",
" 6.000000 \n",
" \n",
" \n",
" mean \n",
" -0.839003 \n",
" 0.968708 \n",
" -0.239959 \n",
" -0.016166 \n",
" \n",
" \n",
" std \n",
" 0.669679 \n",
" 0.699208 \n",
" 1.435586 \n",
" 0.751411 \n",
" \n",
" \n",
" min \n",
" -2.032243 \n",
" 0.027143 \n",
" -2.318931 \n",
" -1.074013 \n",
" \n",
" \n",
" 25% \n",
" -1.053687 \n",
" 0.601390 \n",
" -1.251072 \n",
" -0.357622 \n",
" \n",
" \n",
" 50% \n",
" -0.574883 \n",
" 0.911256 \n",
" 0.161252 \n",
" -0.126444 \n",
" \n",
" \n",
" 75% \n",
" -0.451700 \n",
" 1.291063 \n",
" 0.866743 \n",
" 0.415350 \n",
" \n",
" \n",
" max \n",
" -0.228084 \n",
" 2.046827 \n",
" 1.176614 \n",
" 1.068642 \n",
" \n",
" \n",
"
\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",
" A \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" count \n",
" 4.0 \n",
" 4.0 \n",
" 4.0 \n",
" \n",
" \n",
" mean \n",
" 1.0 \n",
" 1.0 \n",
" 3.0 \n",
" \n",
" \n",
" std \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" \n",
" \n",
" min \n",
" 1.0 \n",
" 1.0 \n",
" 3.0 \n",
" \n",
" \n",
" 25% \n",
" 1.0 \n",
" 1.0 \n",
" 3.0 \n",
" \n",
" \n",
" 50% \n",
" 1.0 \n",
" 1.0 \n",
" 3.0 \n",
" \n",
" \n",
" 75% \n",
" 1.0 \n",
" 1.0 \n",
" 3.0 \n",
" \n",
" \n",
" max \n",
" 1.0 \n",
" 1.0 \n",
" 3.0 \n",
" \n",
" \n",
"
\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",
" 2020-04-16 00:00:00 \n",
" 2020-04-17 00:00:00 \n",
" 2020-04-18 00:00:00 \n",
" 2020-04-19 00:00:00 \n",
" 2020-04-20 00:00:00 \n",
" 2020-04-21 00:00:00 \n",
" \n",
" \n",
" \n",
" \n",
" A \n",
" -0.228084 \n",
" -0.423923 \n",
" -2.032243 \n",
" -1.200005 \n",
" -0.535031 \n",
" -0.614734 \n",
" \n",
" \n",
" B \n",
" 0.712521 \n",
" 0.564346 \n",
" 2.046827 \n",
" 1.109991 \n",
" 1.351420 \n",
" 0.027143 \n",
" \n",
" \n",
" C \n",
" 0.743378 \n",
" -2.318931 \n",
" 1.176614 \n",
" -1.527804 \n",
" 0.907865 \n",
" -0.420875 \n",
" \n",
" \n",
" D \n",
" 0.526823 \n",
" 0.080931 \n",
" -0.365556 \n",
" 1.068642 \n",
" -1.074013 \n",
" -0.333819 \n",
" \n",
" \n",
"
\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",
" 0 \n",
" 1 \n",
" 2 \n",
" 3 \n",
" \n",
" \n",
" \n",
" \n",
" A \n",
" 1 \n",
" 1 \n",
" 1 \n",
" 1 \n",
" \n",
" \n",
" B \n",
" 2020-04-16 18:38:00 \n",
" 2020-04-16 18:38:00 \n",
" 2020-04-16 18:38:00 \n",
" 2020-04-16 18:38:00 \n",
" \n",
" \n",
" C \n",
" 1 \n",
" 1 \n",
" 1 \n",
" 1 \n",
" \n",
" \n",
" D \n",
" 3 \n",
" 3 \n",
" 3 \n",
" 3 \n",
" \n",
" \n",
" E \n",
" test \n",
" train \n",
" test \n",
" train \n",
" \n",
" \n",
" F \n",
" foo \n",
" foo \n",
" foo \n",
" foo \n",
" \n",
" \n",
"
\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",
" D \n",
" C \n",
" B \n",
" A \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" 0.526823 \n",
" 0.743378 \n",
" 0.712521 \n",
" -0.228084 \n",
" \n",
" \n",
" 2020-04-17 \n",
" 0.080931 \n",
" -2.318931 \n",
" 0.564346 \n",
" -0.423923 \n",
" \n",
" \n",
" 2020-04-18 \n",
" -0.365556 \n",
" 1.176614 \n",
" 2.046827 \n",
" -2.032243 \n",
" \n",
" \n",
" 2020-04-19 \n",
" 1.068642 \n",
" -1.527804 \n",
" 1.109991 \n",
" -1.200005 \n",
" \n",
" \n",
" 2020-04-20 \n",
" -1.074013 \n",
" 0.907865 \n",
" 1.351420 \n",
" -0.535031 \n",
" \n",
" \n",
" 2020-04-21 \n",
" -0.333819 \n",
" -0.420875 \n",
" 0.027143 \n",
" -0.614734 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" -0.228084 \n",
" 0.712521 \n",
" 0.743378 \n",
" 0.526823 \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" 0.564346 \n",
" -2.318931 \n",
" 0.080931 \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" 2.046827 \n",
" 1.176614 \n",
" -0.365556 \n",
" \n",
" \n",
" 2020-04-19 \n",
" -1.200005 \n",
" 1.109991 \n",
" -1.527804 \n",
" 1.068642 \n",
" \n",
" \n",
" 2020-04-20 \n",
" -0.535031 \n",
" 1.351420 \n",
" 0.907865 \n",
" -1.074013 \n",
" \n",
" \n",
" 2020-04-21 \n",
" -0.614734 \n",
" 0.027143 \n",
" -0.420875 \n",
" -0.333819 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-21 \n",
" -0.614734 \n",
" 0.027143 \n",
" -0.420875 \n",
" -0.333819 \n",
" \n",
" \n",
" 2020-04-20 \n",
" -0.535031 \n",
" 1.351420 \n",
" 0.907865 \n",
" -1.074013 \n",
" \n",
" \n",
" 2020-04-19 \n",
" -1.200005 \n",
" 1.109991 \n",
" -1.527804 \n",
" 1.068642 \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" 2.046827 \n",
" 1.176614 \n",
" -0.365556 \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" 0.564346 \n",
" -2.318931 \n",
" 0.080931 \n",
" \n",
" \n",
" 2020-04-16 \n",
" -0.228084 \n",
" 0.712521 \n",
" 0.743378 \n",
" 0.526823 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-21 \n",
" -0.614734 \n",
" 0.027143 \n",
" -0.420875 \n",
" -0.333819 \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" 0.564346 \n",
" -2.318931 \n",
" 0.080931 \n",
" \n",
" \n",
" 2020-04-16 \n",
" -0.228084 \n",
" 0.712521 \n",
" 0.743378 \n",
" 0.526823 \n",
" \n",
" \n",
" 2020-04-19 \n",
" -1.200005 \n",
" 1.109991 \n",
" -1.527804 \n",
" 1.068642 \n",
" \n",
" \n",
" 2020-04-20 \n",
" -0.535031 \n",
" 1.351420 \n",
" 0.907865 \n",
" -1.074013 \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" 2.046827 \n",
" 1.176614 \n",
" -0.365556 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" 0.564346 \n",
" -2.318931 \n",
" 0.080931 \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" 2.046827 \n",
" 1.176614 \n",
" -0.365556 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" 2.046827 \n",
" 1.176614 \n",
" -0.365556 \n",
" \n",
" \n",
" 2020-04-19 \n",
" -1.200005 \n",
" 1.109991 \n",
" -1.527804 \n",
" 1.068642 \n",
" \n",
" \n",
" 2020-04-20 \n",
" -0.535031 \n",
" 1.351420 \n",
" 0.907865 \n",
" -1.074013 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" -0.228084 \n",
" 0.712521 \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" 0.564346 \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" 2.046827 \n",
" \n",
" \n",
" 2020-04-19 \n",
" -1.200005 \n",
" 1.109991 \n",
" \n",
" \n",
" 2020-04-20 \n",
" -0.535031 \n",
" 1.351420 \n",
" \n",
" \n",
" 2020-04-21 \n",
" -0.614734 \n",
" 0.027143 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" 2.046827 \n",
" \n",
" \n",
" 2020-04-19 \n",
" -1.200005 \n",
" 1.109991 \n",
" \n",
" \n",
" 2020-04-20 \n",
" -0.535031 \n",
" 1.351420 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" 2.046827 \n",
" 1.176614 \n",
" \n",
" \n",
" 2020-04-19 \n",
" -1.200005 \n",
" 1.109991 \n",
" -1.527804 \n",
" \n",
" \n",
" 2020-04-20 \n",
" -0.535031 \n",
" 1.351420 \n",
" 0.907865 \n",
" \n",
" \n",
" 2020-04-21 \n",
" -0.614734 \n",
" 0.027143 \n",
" -0.420875 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-19 \n",
" -1.200005 \n",
" 1.109991 \n",
" \n",
" \n",
" 2020-04-20 \n",
" -0.535031 \n",
" 1.351420 \n",
" \n",
" \n",
"
\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",
" A \n",
" C \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" -2.318931 \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" 1.176614 \n",
" \n",
" \n",
" 2020-04-20 \n",
" -0.535031 \n",
" 0.907865 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" 0.564346 \n",
" -2.318931 \n",
" 0.080931 \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" 2.046827 \n",
" 1.176614 \n",
" -0.365556 \n",
" \n",
" \n",
"
\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",
" B \n",
" C \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" 0.712521 \n",
" 0.743378 \n",
" \n",
" \n",
" 2020-04-17 \n",
" 0.564346 \n",
" -2.318931 \n",
" \n",
" \n",
" 2020-04-18 \n",
" 2.046827 \n",
" 1.176614 \n",
" \n",
" \n",
" 2020-04-19 \n",
" 1.109991 \n",
" -1.527804 \n",
" \n",
" \n",
" 2020-04-20 \n",
" 1.351420 \n",
" 0.907865 \n",
" \n",
" \n",
" 2020-04-21 \n",
" 0.027143 \n",
" -0.420875 \n",
" \n",
" \n",
"
\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",
" A \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-17 \n",
" -11.332834 \n",
" 7.659436 \n",
" -20.925183 \n",
" \n",
" \n",
" 2020-04-18 \n",
" -11.040688 \n",
" 6.867701 \n",
" -20.157355 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" -0.228084 \n",
" 0.712521 \n",
" 0.743378 \n",
" 0.526823 \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" 0.564346 \n",
" -2.318931 \n",
" 0.080931 \n",
" \n",
" \n",
" 2020-04-19 \n",
" -1.200005 \n",
" 1.109991 \n",
" -1.527804 \n",
" 1.068642 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" False \n",
" True \n",
" True \n",
" True \n",
" \n",
" \n",
" 2020-04-17 \n",
" False \n",
" True \n",
" False \n",
" True \n",
" \n",
" \n",
" 2020-04-18 \n",
" False \n",
" True \n",
" True \n",
" False \n",
" \n",
" \n",
" 2020-04-19 \n",
" False \n",
" True \n",
" False \n",
" True \n",
" \n",
" \n",
" 2020-04-20 \n",
" False \n",
" True \n",
" True \n",
" False \n",
" \n",
" \n",
" 2020-04-21 \n",
" False \n",
" True \n",
" False \n",
" False \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" NaN \n",
" 0.712521 \n",
" 0.743378 \n",
" 0.526823 \n",
" \n",
" \n",
" 2020-04-17 \n",
" NaN \n",
" 0.564346 \n",
" NaN \n",
" 0.080931 \n",
" \n",
" \n",
" 2020-04-18 \n",
" NaN \n",
" 2.046827 \n",
" 1.176614 \n",
" NaN \n",
" \n",
" \n",
" 2020-04-19 \n",
" NaN \n",
" 1.109991 \n",
" NaN \n",
" 1.068642 \n",
" \n",
" \n",
" 2020-04-20 \n",
" NaN \n",
" 1.351420 \n",
" 0.907865 \n",
" NaN \n",
" \n",
" \n",
" 2020-04-21 \n",
" NaN \n",
" 0.027143 \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" E \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" -0.228084 \n",
" 0.712521 \n",
" 0.743378 \n",
" 0.526823 \n",
" one \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" 0.564346 \n",
" -2.318931 \n",
" 0.080931 \n",
" one \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" 2.046827 \n",
" 1.176614 \n",
" -0.365556 \n",
" two \n",
" \n",
" \n",
" 2020-04-19 \n",
" -1.200005 \n",
" 1.109991 \n",
" -1.527804 \n",
" 1.068642 \n",
" three \n",
" \n",
" \n",
" 2020-04-20 \n",
" -0.535031 \n",
" 1.351420 \n",
" 0.907865 \n",
" -1.074013 \n",
" four \n",
" \n",
" \n",
" 2020-04-21 \n",
" -0.614734 \n",
" 0.027143 \n",
" -0.420875 \n",
" -0.333819 \n",
" three \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" E \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" 2.046827 \n",
" 1.176614 \n",
" -0.365556 \n",
" two \n",
" \n",
" \n",
" 2020-04-20 \n",
" -0.535031 \n",
" 1.351420 \n",
" 0.907865 \n",
" -1.074013 \n",
" four \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" F \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.743378 \n",
" 5 \n",
" 1 \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" 0.564346 \n",
" -2.318931 \n",
" 5 \n",
" 2 \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" 2.046827 \n",
" 1.176614 \n",
" 5 \n",
" 3 \n",
" \n",
" \n",
" 2020-04-19 \n",
" -1.200005 \n",
" 1.109991 \n",
" -1.527804 \n",
" 5 \n",
" 4 \n",
" \n",
" \n",
" 2020-04-20 \n",
" -0.535031 \n",
" 1.351420 \n",
" 0.907865 \n",
" 5 \n",
" 5 \n",
" \n",
" \n",
" 2020-04-21 \n",
" -0.614734 \n",
" 0.027143 \n",
" -0.420875 \n",
" 5 \n",
" 6 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" F \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" 0.000000 \n",
" 0.000000 \n",
" -0.743378 \n",
" -5 \n",
" -1 \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" -0.564346 \n",
" -2.318931 \n",
" -5 \n",
" -2 \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" -2.046827 \n",
" -1.176614 \n",
" -5 \n",
" -3 \n",
" \n",
" \n",
" 2020-04-19 \n",
" -1.200005 \n",
" -1.109991 \n",
" -1.527804 \n",
" -5 \n",
" -4 \n",
" \n",
" \n",
" 2020-04-20 \n",
" -0.535031 \n",
" -1.351420 \n",
" -0.907865 \n",
" -5 \n",
" -5 \n",
" \n",
" \n",
" 2020-04-21 \n",
" -0.614734 \n",
" -0.027143 \n",
" -0.420875 \n",
" -5 \n",
" -6 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" F \n",
" E \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.743378 \n",
" 5 \n",
" 1 \n",
" NaN \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" 0.564346 \n",
" -2.318931 \n",
" 5 \n",
" 2 \n",
" NaN \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" 2.046827 \n",
" 1.176614 \n",
" 5 \n",
" 3 \n",
" NaN \n",
" \n",
" \n",
" 2020-04-19 \n",
" -1.200005 \n",
" 1.109991 \n",
" -1.527804 \n",
" 5 \n",
" 4 \n",
" NaN \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" F \n",
" E \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.743378 \n",
" 5 \n",
" 1 \n",
" 1.0 \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" 0.564346 \n",
" -2.318931 \n",
" 5 \n",
" 2 \n",
" 1.0 \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" 2.046827 \n",
" 1.176614 \n",
" 5 \n",
" 3 \n",
" NaN \n",
" \n",
" \n",
" 2020-04-19 \n",
" -1.200005 \n",
" 1.109991 \n",
" -1.527804 \n",
" 5 \n",
" 4 \n",
" NaN \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" F \n",
" E \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.743378 \n",
" 5 \n",
" 1 \n",
" 1.0 \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" 0.564346 \n",
" -2.318931 \n",
" 5 \n",
" 2 \n",
" 1.0 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" F \n",
" E \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.743378 \n",
" 5 \n",
" 1 \n",
" 1.0 \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" 0.564346 \n",
" -2.318931 \n",
" 5 \n",
" 2 \n",
" 1.0 \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" 2.046827 \n",
" 1.176614 \n",
" 5 \n",
" 3 \n",
" 5.0 \n",
" \n",
" \n",
" 2020-04-19 \n",
" -1.200005 \n",
" 1.109991 \n",
" -1.527804 \n",
" 5 \n",
" 4 \n",
" 5.0 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" F \n",
" E \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" \n",
" \n",
" 2020-04-17 \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" \n",
" \n",
" 2020-04-18 \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" True \n",
" \n",
" \n",
" 2020-04-19 \n",
" False \n",
" False \n",
" False \n",
" False \n",
" False \n",
" True \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" F \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" 2020-04-17 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" 2020-04-18 \n",
" -3.032243 \n",
" 1.046827 \n",
" 0.176614 \n",
" 4.0 \n",
" 2.0 \n",
" \n",
" \n",
" 2020-04-19 \n",
" -4.200005 \n",
" -1.890009 \n",
" -4.527804 \n",
" 2.0 \n",
" 1.0 \n",
" \n",
" \n",
" 2020-04-20 \n",
" -5.535031 \n",
" -3.648580 \n",
" -4.092135 \n",
" 0.0 \n",
" 0.0 \n",
" \n",
" \n",
" 2020-04-21 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" F \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.743378 \n",
" 5 \n",
" 1 \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" 0.564346 \n",
" -1.575552 \n",
" 10 \n",
" 3 \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.456166 \n",
" 2.611174 \n",
" -0.398938 \n",
" 15 \n",
" 6 \n",
" \n",
" \n",
" 2020-04-19 \n",
" -3.656170 \n",
" 3.721165 \n",
" -1.926743 \n",
" 20 \n",
" 10 \n",
" \n",
" \n",
" 2020-04-20 \n",
" -4.191201 \n",
" 5.072585 \n",
" -1.018877 \n",
" 25 \n",
" 15 \n",
" \n",
" \n",
" 2020-04-21 \n",
" -4.805935 \n",
" 5.099728 \n",
" -1.439752 \n",
" 30 \n",
" 21 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" F \n",
" \n",
" \n",
" \n",
" \n",
" 2020-04-16 \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.743378 \n",
" 5.743378 \n",
" 6.743378 \n",
" \n",
" \n",
" 2020-04-17 \n",
" -0.423923 \n",
" 0.140424 \n",
" -2.178507 \n",
" 2.821493 \n",
" 4.821493 \n",
" \n",
" \n",
" 2020-04-18 \n",
" -2.032243 \n",
" 0.014584 \n",
" 1.191198 \n",
" 6.191198 \n",
" 9.191198 \n",
" \n",
" \n",
" 2020-04-19 \n",
" -1.200005 \n",
" -0.090013 \n",
" -1.617818 \n",
" 3.382182 \n",
" 7.382182 \n",
" \n",
" \n",
" 2020-04-20 \n",
" -0.535031 \n",
" 0.816389 \n",
" 1.724255 \n",
" 6.724255 \n",
" 11.724255 \n",
" \n",
" \n",
" 2020-04-21 \n",
" -0.614734 \n",
" -0.587591 \n",
" -1.008466 \n",
" 3.991534 \n",
" 9.991534 \n",
" \n",
" \n",
"
\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",
" 0 \n",
" 1 \n",
" 2 \n",
" 3 \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" -0.089143 \n",
" 0.087569 \n",
" 0.218078 \n",
" -0.336815 \n",
" \n",
" \n",
" 1 \n",
" -0.694835 \n",
" 0.108324 \n",
" -1.882762 \n",
" -0.220210 \n",
" \n",
" \n",
" 2 \n",
" -2.069784 \n",
" -0.788424 \n",
" -1.694595 \n",
" 0.569263 \n",
" \n",
" \n",
" 3 \n",
" 2.433036 \n",
" 0.719851 \n",
" -0.109935 \n",
" 0.177864 \n",
" \n",
" \n",
" 4 \n",
" -0.838252 \n",
" 1.117676 \n",
" 0.880839 \n",
" -1.118529 \n",
" \n",
" \n",
" 5 \n",
" 1.706060 \n",
" 0.290877 \n",
" -0.907941 \n",
" -0.532450 \n",
" \n",
" \n",
" 6 \n",
" 0.118169 \n",
" -0.496975 \n",
" -0.190422 \n",
" 0.783875 \n",
" \n",
" \n",
" 7 \n",
" -1.213645 \n",
" -0.489622 \n",
" -0.798443 \n",
" -0.471611 \n",
" \n",
" \n",
" 8 \n",
" -0.314598 \n",
" -2.658906 \n",
" -1.139778 \n",
" 0.374437 \n",
" \n",
" \n",
" 9 \n",
" 0.229281 \n",
" -1.372309 \n",
" 0.996916 \n",
" -1.013462 \n",
" \n",
" \n",
"
\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",
" 0 \n",
" 1 \n",
" 2 \n",
" 3 \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" -0.089143 \n",
" 0.087569 \n",
" 0.218078 \n",
" -0.336815 \n",
" \n",
" \n",
" 1 \n",
" -0.694835 \n",
" 0.108324 \n",
" -1.882762 \n",
" -0.220210 \n",
" \n",
" \n",
" 2 \n",
" -2.069784 \n",
" -0.788424 \n",
" -1.694595 \n",
" 0.569263 \n",
" \n",
" \n",
" 3 \n",
" 2.433036 \n",
" 0.719851 \n",
" -0.109935 \n",
" 0.177864 \n",
" \n",
" \n",
" 4 \n",
" -0.838252 \n",
" 1.117676 \n",
" 0.880839 \n",
" -1.118529 \n",
" \n",
" \n",
" 5 \n",
" 1.706060 \n",
" 0.290877 \n",
" -0.907941 \n",
" -0.532450 \n",
" \n",
" \n",
" 6 \n",
" 0.118169 \n",
" -0.496975 \n",
" -0.190422 \n",
" 0.783875 \n",
" \n",
" \n",
" 7 \n",
" -1.213645 \n",
" -0.489622 \n",
" -0.798443 \n",
" -0.471611 \n",
" \n",
" \n",
" 8 \n",
" -0.314598 \n",
" -2.658906 \n",
" -1.139778 \n",
" 0.374437 \n",
" \n",
" \n",
" 9 \n",
" 0.229281 \n",
" -1.372309 \n",
" 0.996916 \n",
" -1.013462 \n",
" \n",
" \n",
"
\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",
" key \n",
" lval \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" foo \n",
" 1 \n",
" \n",
" \n",
" 1 \n",
" foo \n",
" 2 \n",
" \n",
" \n",
"
\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",
" key \n",
" rval \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" foo \n",
" 4 \n",
" \n",
" \n",
" 1 \n",
" foo \n",
" 5 \n",
" \n",
" \n",
"
\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",
" key \n",
" lval \n",
" rval \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" foo \n",
" 1 \n",
" 4 \n",
" \n",
" \n",
" 1 \n",
" foo \n",
" 1 \n",
" 5 \n",
" \n",
" \n",
" 2 \n",
" foo \n",
" 2 \n",
" 4 \n",
" \n",
" \n",
" 3 \n",
" foo \n",
" 2 \n",
" 5 \n",
" \n",
" \n",
"
\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",
" key \n",
" lval \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" foo \n",
" 1 \n",
" \n",
" \n",
" 1 \n",
" bar \n",
" 2 \n",
" \n",
" \n",
"
\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",
" key \n",
" rval \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" foo \n",
" 4 \n",
" \n",
" \n",
" 1 \n",
" bar \n",
" 5 \n",
" \n",
" \n",
"
\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",
" key \n",
" lval \n",
" rval \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" foo \n",
" 1 \n",
" 4 \n",
" \n",
" \n",
" 1 \n",
" bar \n",
" 2 \n",
" 5 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" -2.727829 \n",
" -1.382168 \n",
" 0.961920 \n",
" 0.083472 \n",
" \n",
" \n",
" 1 \n",
" -0.297131 \n",
" -0.294723 \n",
" 0.303267 \n",
" -0.539177 \n",
" \n",
" \n",
" 2 \n",
" -0.226735 \n",
" -2.157170 \n",
" 1.559418 \n",
" 0.102023 \n",
" \n",
" \n",
" 3 \n",
" 0.569927 \n",
" -0.800855 \n",
" 0.918515 \n",
" 1.630873 \n",
" \n",
" \n",
" 4 \n",
" 0.402999 \n",
" -2.238052 \n",
" 2.181635 \n",
" 1.950669 \n",
" \n",
" \n",
" 5 \n",
" 1.238971 \n",
" -0.165159 \n",
" 0.688200 \n",
" 0.793499 \n",
" \n",
" \n",
" 6 \n",
" 1.356265 \n",
" -0.034859 \n",
" -0.020774 \n",
" 0.485487 \n",
" \n",
" \n",
" 7 \n",
" -1.793398 \n",
" 0.900625 \n",
" 0.365789 \n",
" -2.089145 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" -2.727829 \n",
" -1.382168 \n",
" 0.961920 \n",
" 0.083472 \n",
" \n",
" \n",
" 1 \n",
" -0.297131 \n",
" -0.294723 \n",
" 0.303267 \n",
" -0.539177 \n",
" \n",
" \n",
" 2 \n",
" -0.226735 \n",
" -2.157170 \n",
" 1.559418 \n",
" 0.102023 \n",
" \n",
" \n",
" 3 \n",
" 0.569927 \n",
" -0.800855 \n",
" 0.918515 \n",
" 1.630873 \n",
" \n",
" \n",
" 4 \n",
" 0.402999 \n",
" -2.238052 \n",
" 2.181635 \n",
" 1.950669 \n",
" \n",
" \n",
" 5 \n",
" 1.238971 \n",
" -0.165159 \n",
" 0.688200 \n",
" 0.793499 \n",
" \n",
" \n",
" 6 \n",
" 1.356265 \n",
" -0.034859 \n",
" -0.020774 \n",
" 0.485487 \n",
" \n",
" \n",
" 7 \n",
" -1.793398 \n",
" 0.900625 \n",
" 0.365789 \n",
" -2.089145 \n",
" \n",
" \n",
" 8 \n",
" 0.569927 \n",
" -0.800855 \n",
" 0.918515 \n",
" 1.630873 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" -2.727829 \n",
" -1.382168 \n",
" 0.961920 \n",
" 0.083472 \n",
" \n",
" \n",
" 1 \n",
" -0.297131 \n",
" -0.294723 \n",
" 0.303267 \n",
" -0.539177 \n",
" \n",
" \n",
" 2 \n",
" -0.226735 \n",
" -2.157170 \n",
" 1.559418 \n",
" 0.102023 \n",
" \n",
" \n",
" 3 \n",
" 0.569927 \n",
" -0.800855 \n",
" 0.918515 \n",
" 1.630873 \n",
" \n",
" \n",
" 4 \n",
" 0.402999 \n",
" -2.238052 \n",
" 2.181635 \n",
" 1.950669 \n",
" \n",
" \n",
" 5 \n",
" 1.238971 \n",
" -0.165159 \n",
" 0.688200 \n",
" 0.793499 \n",
" \n",
" \n",
" 6 \n",
" 1.356265 \n",
" -0.034859 \n",
" -0.020774 \n",
" 0.485487 \n",
" \n",
" \n",
" 7 \n",
" -1.793398 \n",
" 0.900625 \n",
" 0.365789 \n",
" -2.089145 \n",
" \n",
" \n",
" 4 \n",
" 0.402999 \n",
" -2.238052 \n",
" 2.181635 \n",
" 1.950669 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" foo \n",
" one \n",
" 1.038586 \n",
" 2.040014 \n",
" \n",
" \n",
" 1 \n",
" bar \n",
" one \n",
" 0.454452 \n",
" -0.553457 \n",
" \n",
" \n",
" 2 \n",
" foo \n",
" two \n",
" -0.730273 \n",
" -0.207136 \n",
" \n",
" \n",
" 3 \n",
" bar \n",
" three \n",
" 0.435136 \n",
" 0.443462 \n",
" \n",
" \n",
" 4 \n",
" foo \n",
" two \n",
" 2.557988 \n",
" -1.831259 \n",
" \n",
" \n",
" 5 \n",
" bar \n",
" two \n",
" 1.131084 \n",
" 0.915332 \n",
" \n",
" \n",
" 6 \n",
" foo \n",
" one \n",
" 1.078171 \n",
" 0.037355 \n",
" \n",
" \n",
" 7 \n",
" foo \n",
" three \n",
" 2.057203 \n",
" 1.209778 \n",
" \n",
" \n",
"
\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",
" C \n",
" D \n",
" \n",
" \n",
" A \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" bar \n",
" -1.001520 \n",
" 1.880284 \n",
" \n",
" \n",
" foo \n",
" 1.365107 \n",
" 1.459170 \n",
" \n",
" \n",
"
\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",
" C \n",
" D \n",
" \n",
" \n",
" A \n",
" B \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" bar \n",
" one \n",
" 0.598883 \n",
" 1.667737 \n",
" \n",
" \n",
" three \n",
" -0.605689 \n",
" -0.531403 \n",
" \n",
" \n",
" two \n",
" -0.994715 \n",
" 0.743951 \n",
" \n",
" \n",
" foo \n",
" one \n",
" -0.090250 \n",
" 0.694644 \n",
" \n",
" \n",
" three \n",
" 0.738067 \n",
" 1.498865 \n",
" \n",
" \n",
" two \n",
" 0.717290 \n",
" -0.734339 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" \n",
" \n",
" first \n",
" second \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" bar \n",
" one \n",
" 1.402402 \n",
" -0.215913 \n",
" \n",
" \n",
" two \n",
" -0.305333 \n",
" -0.679614 \n",
" \n",
" \n",
" baz \n",
" one \n",
" 0.745205 \n",
" 0.872718 \n",
" \n",
" \n",
" two \n",
" 0.421718 \n",
" -0.662528 \n",
" \n",
" \n",
" foo \n",
" one \n",
" -1.433628 \n",
" 0.627898 \n",
" \n",
" \n",
" two \n",
" 2.129267 \n",
" -0.260206 \n",
" \n",
" \n",
" qux \n",
" one \n",
" 0.498752 \n",
" -0.622814 \n",
" \n",
" \n",
" two \n",
" -0.356492 \n",
" 1.364184 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" \n",
" \n",
" first \n",
" second \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" bar \n",
" one \n",
" 1.402402 \n",
" -0.215913 \n",
" \n",
" \n",
" two \n",
" -0.305333 \n",
" -0.679614 \n",
" \n",
" \n",
" baz \n",
" one \n",
" 0.745205 \n",
" 0.872718 \n",
" \n",
" \n",
" two \n",
" 0.421718 \n",
" -0.662528 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" \n",
" \n",
" first \n",
" second \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" bar \n",
" one \n",
" 1.402402 \n",
" -0.215913 \n",
" \n",
" \n",
" two \n",
" -0.305333 \n",
" -0.679614 \n",
" \n",
" \n",
" baz \n",
" one \n",
" 0.745205 \n",
" 0.872718 \n",
" \n",
" \n",
" two \n",
" 0.421718 \n",
" -0.662528 \n",
" \n",
" \n",
"
\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",
" second \n",
" one \n",
" two \n",
" \n",
" \n",
" first \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" bar \n",
" A \n",
" 1.402402 \n",
" -0.305333 \n",
" \n",
" \n",
" B \n",
" -0.215913 \n",
" -0.679614 \n",
" \n",
" \n",
" baz \n",
" A \n",
" 0.745205 \n",
" 0.421718 \n",
" \n",
" \n",
" B \n",
" 0.872718 \n",
" -0.662528 \n",
" \n",
" \n",
"
\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",
" first \n",
" bar \n",
" baz \n",
" \n",
" \n",
" second \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" one \n",
" A \n",
" 1.402402 \n",
" 0.745205 \n",
" \n",
" \n",
" B \n",
" -0.215913 \n",
" 0.872718 \n",
" \n",
" \n",
" two \n",
" A \n",
" -0.305333 \n",
" 0.421718 \n",
" \n",
" \n",
" B \n",
" -0.679614 \n",
" -0.662528 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" E \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" one \n",
" A \n",
" foo \n",
" 0.072696 \n",
" 0.305015 \n",
" \n",
" \n",
" 1 \n",
" one \n",
" B \n",
" foo \n",
" 1.428383 \n",
" -1.108178 \n",
" \n",
" \n",
" 2 \n",
" two \n",
" C \n",
" foo \n",
" 1.239483 \n",
" 0.001580 \n",
" \n",
" \n",
" 3 \n",
" three \n",
" A \n",
" bar \n",
" -0.953547 \n",
" 1.061740 \n",
" \n",
" \n",
" 4 \n",
" one \n",
" B \n",
" bar \n",
" 0.762730 \n",
" 1.161542 \n",
" \n",
" \n",
" 5 \n",
" one \n",
" C \n",
" bar \n",
" -0.372740 \n",
" -0.480251 \n",
" \n",
" \n",
" 6 \n",
" two \n",
" A \n",
" foo \n",
" 0.765181 \n",
" -1.034218 \n",
" \n",
" \n",
" 7 \n",
" three \n",
" B \n",
" foo \n",
" -1.858334 \n",
" 0.359220 \n",
" \n",
" \n",
" 8 \n",
" one \n",
" C \n",
" foo \n",
" -0.952807 \n",
" 1.067494 \n",
" \n",
" \n",
" 9 \n",
" one \n",
" A \n",
" bar \n",
" 0.541013 \n",
" -0.280833 \n",
" \n",
" \n",
" 10 \n",
" two \n",
" B \n",
" bar \n",
" -1.810560 \n",
" -0.829793 \n",
" \n",
" \n",
" 11 \n",
" three \n",
" C \n",
" bar \n",
" -1.049108 \n",
" -0.295998 \n",
" \n",
" \n",
"
\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",
" C \n",
" bar \n",
" foo \n",
" \n",
" \n",
" A \n",
" B \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" one \n",
" A \n",
" 0.541013 \n",
" 0.072696 \n",
" \n",
" \n",
" B \n",
" 0.762730 \n",
" 1.428383 \n",
" \n",
" \n",
" C \n",
" -0.372740 \n",
" -0.952807 \n",
" \n",
" \n",
" three \n",
" A \n",
" -0.953547 \n",
" NaN \n",
" \n",
" \n",
" B \n",
" NaN \n",
" -1.858334 \n",
" \n",
" \n",
" C \n",
" -1.049108 \n",
" NaN \n",
" \n",
" \n",
" two \n",
" A \n",
" NaN \n",
" 0.765181 \n",
" \n",
" \n",
" B \n",
" -1.810560 \n",
" NaN \n",
" \n",
" \n",
" C \n",
" NaN \n",
" 1.239483 \n",
" \n",
" \n",
"
\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",
" id \n",
" raw_grade \n",
" grade \n",
" \n",
" \n",
" \n",
" \n",
" 5 \n",
" 6 \n",
" e \n",
" very bad \n",
" \n",
" \n",
" 1 \n",
" 2 \n",
" b \n",
" good \n",
" \n",
" \n",
" 2 \n",
" 3 \n",
" b \n",
" good \n",
" \n",
" \n",
" 0 \n",
" 1 \n",
" a \n",
" very good \n",
" \n",
" \n",
" 3 \n",
" 4 \n",
" a \n",
" very good \n",
" \n",
" \n",
" 4 \n",
" 5 \n",
" a \n",
" very good \n",
" \n",
" \n",
"
\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",
" Unnamed: 0 \n",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 2020-01-01 \n",
" -1.397481 \n",
" -0.453722 \n",
" 1.374079 \n",
" -2.095767 \n",
" \n",
" \n",
" 1 \n",
" 2020-01-02 \n",
" -1.363418 \n",
" 0.529293 \n",
" 0.178497 \n",
" -2.364989 \n",
" \n",
" \n",
" 2 \n",
" 2020-01-03 \n",
" -2.047267 \n",
" -0.333020 \n",
" 0.379978 \n",
" -2.628204 \n",
" \n",
" \n",
" 3 \n",
" 2020-01-04 \n",
" -2.305870 \n",
" -0.145598 \n",
" -0.232491 \n",
" -2.812290 \n",
" \n",
" \n",
" 4 \n",
" 2020-01-05 \n",
" -1.851390 \n",
" -1.378215 \n",
" -1.202399 \n",
" -4.574516 \n",
" \n",
" \n",
" 5 \n",
" 2020-01-06 \n",
" -3.438928 \n",
" -0.779975 \n",
" -1.864979 \n",
" -5.666847 \n",
" \n",
" \n",
" 6 \n",
" 2020-01-07 \n",
" -4.201270 \n",
" -0.827366 \n",
" -0.796513 \n",
" -5.267628 \n",
" \n",
" \n",
" 7 \n",
" 2020-01-08 \n",
" -5.682762 \n",
" -1.009404 \n",
" -0.760801 \n",
" -4.696243 \n",
" \n",
" \n",
" 8 \n",
" 2020-01-09 \n",
" -4.362126 \n",
" -0.768552 \n",
" -0.747517 \n",
" -5.562345 \n",
" \n",
" \n",
" 9 \n",
" 2020-01-10 \n",
" -5.226357 \n",
" -1.791920 \n",
" 0.290504 \n",
" -5.214061 \n",
" \n",
" \n",
" 10 \n",
" 2020-01-11 \n",
" -4.429691 \n",
" -2.026951 \n",
" -0.821212 \n",
" -6.621030 \n",
" \n",
" \n",
" 11 \n",
" 2020-01-12 \n",
" -4.222744 \n",
" -2.875169 \n",
" -0.654313 \n",
" -5.926621 \n",
" \n",
" \n",
" 12 \n",
" 2020-01-13 \n",
" -2.413314 \n",
" -3.329878 \n",
" -1.595397 \n",
" -5.585677 \n",
" \n",
" \n",
" 13 \n",
" 2020-01-14 \n",
" -2.769944 \n",
" -3.536045 \n",
" -1.463671 \n",
" -5.098753 \n",
" \n",
" \n",
" 14 \n",
" 2020-01-15 \n",
" -3.599683 \n",
" -4.973067 \n",
" -3.859425 \n",
" -5.823875 \n",
" \n",
" \n",
" 15 \n",
" 2020-01-16 \n",
" -3.486154 \n",
" -4.792330 \n",
" -2.866047 \n",
" -6.312086 \n",
" \n",
" \n",
" 16 \n",
" 2020-01-17 \n",
" -4.232714 \n",
" -5.082053 \n",
" -3.572924 \n",
" -8.478300 \n",
" \n",
" \n",
" 17 \n",
" 2020-01-18 \n",
" -5.346857 \n",
" -5.787422 \n",
" -4.313125 \n",
" -8.595854 \n",
" \n",
" \n",
" 18 \n",
" 2020-01-19 \n",
" -5.720494 \n",
" -5.620498 \n",
" -3.699862 \n",
" -9.678113 \n",
" \n",
" \n",
" 19 \n",
" 2020-01-20 \n",
" -5.264735 \n",
" -4.938944 \n",
" -2.354040 \n",
" -8.942524 \n",
" \n",
" \n",
" 20 \n",
" 2020-01-21 \n",
" -5.407854 \n",
" -5.379811 \n",
" -2.284447 \n",
" -8.068545 \n",
" \n",
" \n",
" 21 \n",
" 2020-01-22 \n",
" -5.793401 \n",
" -5.501279 \n",
" -2.254013 \n",
" -7.997644 \n",
" \n",
" \n",
" 22 \n",
" 2020-01-23 \n",
" -6.796539 \n",
" -4.692782 \n",
" -2.330458 \n",
" -7.449650 \n",
" \n",
" \n",
" 23 \n",
" 2020-01-24 \n",
" -7.502072 \n",
" -4.085084 \n",
" -1.810495 \n",
" -6.540544 \n",
" \n",
" \n",
" 24 \n",
" 2020-01-25 \n",
" -7.639024 \n",
" -3.791416 \n",
" 1.214301 \n",
" -7.599166 \n",
" \n",
" \n",
" 25 \n",
" 2020-01-26 \n",
" -7.783544 \n",
" -2.180918 \n",
" 1.628560 \n",
" -7.928116 \n",
" \n",
" \n",
" 26 \n",
" 2020-01-27 \n",
" -7.673699 \n",
" -3.485888 \n",
" 0.640970 \n",
" -8.124872 \n",
" \n",
" \n",
" 27 \n",
" 2020-01-28 \n",
" -7.435098 \n",
" -4.480212 \n",
" -0.409425 \n",
" -7.943383 \n",
" \n",
" \n",
" 28 \n",
" 2020-01-29 \n",
" -6.843557 \n",
" -5.069680 \n",
" -1.650871 \n",
" -7.311741 \n",
" \n",
" \n",
" 29 \n",
" 2020-01-30 \n",
" -7.647267 \n",
" -4.115332 \n",
" -1.558887 \n",
" -6.308304 \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 970 \n",
" 2022-08-28 \n",
" 17.157914 \n",
" -23.306973 \n",
" -12.461653 \n",
" -2.478731 \n",
" \n",
" \n",
" 971 \n",
" 2022-08-29 \n",
" 18.207251 \n",
" -23.725280 \n",
" -12.912440 \n",
" -2.664828 \n",
" \n",
" \n",
" 972 \n",
" 2022-08-30 \n",
" 17.968302 \n",
" -21.485150 \n",
" -15.044877 \n",
" -4.034060 \n",
" \n",
" \n",
" 973 \n",
" 2022-08-31 \n",
" 18.933869 \n",
" -21.587237 \n",
" -16.046081 \n",
" -4.014128 \n",
" \n",
" \n",
" 974 \n",
" 2022-09-01 \n",
" 18.337284 \n",
" -21.451739 \n",
" -15.028398 \n",
" -4.147177 \n",
" \n",
" \n",
" 975 \n",
" 2022-09-02 \n",
" 18.783912 \n",
" -21.096423 \n",
" -15.506137 \n",
" -3.858413 \n",
" \n",
" \n",
" 976 \n",
" 2022-09-03 \n",
" 18.828378 \n",
" -19.514168 \n",
" -16.924864 \n",
" -2.559397 \n",
" \n",
" \n",
" 977 \n",
" 2022-09-04 \n",
" 18.570511 \n",
" -21.482747 \n",
" -17.147155 \n",
" -4.267082 \n",
" \n",
" \n",
" 978 \n",
" 2022-09-05 \n",
" 17.212119 \n",
" -22.331837 \n",
" -16.496095 \n",
" -5.990857 \n",
" \n",
" \n",
" 979 \n",
" 2022-09-06 \n",
" 15.726498 \n",
" -23.219830 \n",
" -19.321023 \n",
" -5.281962 \n",
" \n",
" \n",
" 980 \n",
" 2022-09-07 \n",
" 16.053999 \n",
" -22.681168 \n",
" -19.139536 \n",
" -5.587482 \n",
" \n",
" \n",
" 981 \n",
" 2022-09-08 \n",
" 17.335456 \n",
" -23.320514 \n",
" -21.271891 \n",
" -4.048170 \n",
" \n",
" \n",
" 982 \n",
" 2022-09-09 \n",
" 16.925567 \n",
" -24.175782 \n",
" -22.318101 \n",
" -4.890968 \n",
" \n",
" \n",
" 983 \n",
" 2022-09-10 \n",
" 18.652048 \n",
" -25.436089 \n",
" -22.213175 \n",
" -6.330027 \n",
" \n",
" \n",
" 984 \n",
" 2022-09-11 \n",
" 19.535978 \n",
" -25.673818 \n",
" -23.064392 \n",
" -5.673334 \n",
" \n",
" \n",
" 985 \n",
" 2022-09-12 \n",
" 19.632355 \n",
" -26.369119 \n",
" -22.953900 \n",
" -3.463010 \n",
" \n",
" \n",
" 986 \n",
" 2022-09-13 \n",
" 18.792587 \n",
" -25.430236 \n",
" -23.672206 \n",
" -2.292810 \n",
" \n",
" \n",
" 987 \n",
" 2022-09-14 \n",
" 21.200064 \n",
" -26.299390 \n",
" -23.567706 \n",
" -2.753986 \n",
" \n",
" \n",
" 988 \n",
" 2022-09-15 \n",
" 22.890536 \n",
" -27.813985 \n",
" -23.938164 \n",
" -3.195772 \n",
" \n",
" \n",
" 989 \n",
" 2022-09-16 \n",
" 23.138447 \n",
" -25.855344 \n",
" -24.390078 \n",
" -3.612660 \n",
" \n",
" \n",
" 990 \n",
" 2022-09-17 \n",
" 23.163567 \n",
" -26.157774 \n",
" -24.309178 \n",
" -3.155928 \n",
" \n",
" \n",
" 991 \n",
" 2022-09-18 \n",
" 20.973996 \n",
" -27.319631 \n",
" -22.948785 \n",
" -4.487101 \n",
" \n",
" \n",
" 992 \n",
" 2022-09-19 \n",
" 21.090756 \n",
" -26.712847 \n",
" -21.722990 \n",
" -4.110810 \n",
" \n",
" \n",
" 993 \n",
" 2022-09-20 \n",
" 21.848391 \n",
" -25.018472 \n",
" -21.850579 \n",
" -4.360523 \n",
" \n",
" \n",
" 994 \n",
" 2022-09-21 \n",
" 22.898217 \n",
" -26.005364 \n",
" -20.914269 \n",
" -5.357187 \n",
" \n",
" \n",
" 995 \n",
" 2022-09-22 \n",
" 21.978310 \n",
" -25.001244 \n",
" -20.881626 \n",
" -5.606849 \n",
" \n",
" \n",
" 996 \n",
" 2022-09-23 \n",
" 24.132628 \n",
" -25.692639 \n",
" -20.310265 \n",
" -6.258977 \n",
" \n",
" \n",
" 997 \n",
" 2022-09-24 \n",
" 23.777794 \n",
" -25.485527 \n",
" -21.305882 \n",
" -5.330284 \n",
" \n",
" \n",
" 998 \n",
" 2022-09-25 \n",
" 25.105611 \n",
" -25.485135 \n",
" -22.407657 \n",
" -6.600228 \n",
" \n",
" \n",
" 999 \n",
" 2022-09-26 \n",
" 25.207099 \n",
" -25.512208 \n",
" -23.434955 \n",
" -7.275999 \n",
" \n",
" \n",
"
\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",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 2020-01-01 \n",
" -1.397481 \n",
" -0.453722 \n",
" 1.374079 \n",
" -2.095767 \n",
" \n",
" \n",
" 2020-01-02 \n",
" -1.363418 \n",
" 0.529293 \n",
" 0.178497 \n",
" -2.364989 \n",
" \n",
" \n",
" 2020-01-03 \n",
" -2.047267 \n",
" -0.333020 \n",
" 0.379978 \n",
" -2.628204 \n",
" \n",
" \n",
" 2020-01-04 \n",
" -2.305870 \n",
" -0.145598 \n",
" -0.232491 \n",
" -2.812290 \n",
" \n",
" \n",
" 2020-01-05 \n",
" -1.851390 \n",
" -1.378215 \n",
" -1.202399 \n",
" -4.574516 \n",
" \n",
" \n",
" 2020-01-06 \n",
" -3.438928 \n",
" -0.779975 \n",
" -1.864979 \n",
" -5.666847 \n",
" \n",
" \n",
" 2020-01-07 \n",
" -4.201270 \n",
" -0.827366 \n",
" -0.796513 \n",
" -5.267628 \n",
" \n",
" \n",
" 2020-01-08 \n",
" -5.682762 \n",
" -1.009404 \n",
" -0.760801 \n",
" -4.696243 \n",
" \n",
" \n",
" 2020-01-09 \n",
" -4.362126 \n",
" -0.768552 \n",
" -0.747517 \n",
" -5.562345 \n",
" \n",
" \n",
" 2020-01-10 \n",
" -5.226357 \n",
" -1.791920 \n",
" 0.290504 \n",
" -5.214061 \n",
" \n",
" \n",
" 2020-01-11 \n",
" -4.429691 \n",
" -2.026951 \n",
" -0.821212 \n",
" -6.621030 \n",
" \n",
" \n",
" 2020-01-12 \n",
" -4.222744 \n",
" -2.875169 \n",
" -0.654313 \n",
" -5.926621 \n",
" \n",
" \n",
" 2020-01-13 \n",
" -2.413314 \n",
" -3.329878 \n",
" -1.595397 \n",
" -5.585677 \n",
" \n",
" \n",
" 2020-01-14 \n",
" -2.769944 \n",
" -3.536045 \n",
" -1.463671 \n",
" -5.098753 \n",
" \n",
" \n",
" 2020-01-15 \n",
" -3.599683 \n",
" -4.973067 \n",
" -3.859425 \n",
" -5.823875 \n",
" \n",
" \n",
" 2020-01-16 \n",
" -3.486154 \n",
" -4.792330 \n",
" -2.866047 \n",
" -6.312086 \n",
" \n",
" \n",
" 2020-01-17 \n",
" -4.232714 \n",
" -5.082053 \n",
" -3.572924 \n",
" -8.478300 \n",
" \n",
" \n",
" 2020-01-18 \n",
" -5.346857 \n",
" -5.787422 \n",
" -4.313125 \n",
" -8.595854 \n",
" \n",
" \n",
" 2020-01-19 \n",
" -5.720494 \n",
" -5.620498 \n",
" -3.699862 \n",
" -9.678113 \n",
" \n",
" \n",
" 2020-01-20 \n",
" -5.264735 \n",
" -4.938944 \n",
" -2.354040 \n",
" -8.942524 \n",
" \n",
" \n",
" 2020-01-21 \n",
" -5.407854 \n",
" -5.379811 \n",
" -2.284447 \n",
" -8.068545 \n",
" \n",
" \n",
" 2020-01-22 \n",
" -5.793401 \n",
" -5.501279 \n",
" -2.254013 \n",
" -7.997644 \n",
" \n",
" \n",
" 2020-01-23 \n",
" -6.796539 \n",
" -4.692782 \n",
" -2.330458 \n",
" -7.449650 \n",
" \n",
" \n",
" 2020-01-24 \n",
" -7.502072 \n",
" -4.085084 \n",
" -1.810495 \n",
" -6.540544 \n",
" \n",
" \n",
" 2020-01-25 \n",
" -7.639024 \n",
" -3.791416 \n",
" 1.214301 \n",
" -7.599166 \n",
" \n",
" \n",
" 2020-01-26 \n",
" -7.783544 \n",
" -2.180918 \n",
" 1.628560 \n",
" -7.928116 \n",
" \n",
" \n",
" 2020-01-27 \n",
" -7.673699 \n",
" -3.485888 \n",
" 0.640970 \n",
" -8.124872 \n",
" \n",
" \n",
" 2020-01-28 \n",
" -7.435098 \n",
" -4.480212 \n",
" -0.409425 \n",
" -7.943383 \n",
" \n",
" \n",
" 2020-01-29 \n",
" -6.843557 \n",
" -5.069680 \n",
" -1.650871 \n",
" -7.311741 \n",
" \n",
" \n",
" 2020-01-30 \n",
" -7.647267 \n",
" -4.115332 \n",
" -1.558887 \n",
" -6.308304 \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 2022-08-28 \n",
" 17.157914 \n",
" -23.306973 \n",
" -12.461653 \n",
" -2.478731 \n",
" \n",
" \n",
" 2022-08-29 \n",
" 18.207251 \n",
" -23.725280 \n",
" -12.912440 \n",
" -2.664828 \n",
" \n",
" \n",
" 2022-08-30 \n",
" 17.968302 \n",
" -21.485150 \n",
" -15.044877 \n",
" -4.034060 \n",
" \n",
" \n",
" 2022-08-31 \n",
" 18.933869 \n",
" -21.587237 \n",
" -16.046081 \n",
" -4.014128 \n",
" \n",
" \n",
" 2022-09-01 \n",
" 18.337284 \n",
" -21.451739 \n",
" -15.028398 \n",
" -4.147177 \n",
" \n",
" \n",
" 2022-09-02 \n",
" 18.783912 \n",
" -21.096423 \n",
" -15.506137 \n",
" -3.858413 \n",
" \n",
" \n",
" 2022-09-03 \n",
" 18.828378 \n",
" -19.514168 \n",
" -16.924864 \n",
" -2.559397 \n",
" \n",
" \n",
" 2022-09-04 \n",
" 18.570511 \n",
" -21.482747 \n",
" -17.147155 \n",
" -4.267082 \n",
" \n",
" \n",
" 2022-09-05 \n",
" 17.212119 \n",
" -22.331837 \n",
" -16.496095 \n",
" -5.990857 \n",
" \n",
" \n",
" 2022-09-06 \n",
" 15.726498 \n",
" -23.219830 \n",
" -19.321023 \n",
" -5.281962 \n",
" \n",
" \n",
" 2022-09-07 \n",
" 16.053999 \n",
" -22.681168 \n",
" -19.139536 \n",
" -5.587482 \n",
" \n",
" \n",
" 2022-09-08 \n",
" 17.335456 \n",
" -23.320514 \n",
" -21.271891 \n",
" -4.048170 \n",
" \n",
" \n",
" 2022-09-09 \n",
" 16.925567 \n",
" -24.175782 \n",
" -22.318101 \n",
" -4.890968 \n",
" \n",
" \n",
" 2022-09-10 \n",
" 18.652048 \n",
" -25.436089 \n",
" -22.213175 \n",
" -6.330027 \n",
" \n",
" \n",
" 2022-09-11 \n",
" 19.535978 \n",
" -25.673818 \n",
" -23.064392 \n",
" -5.673334 \n",
" \n",
" \n",
" 2022-09-12 \n",
" 19.632355 \n",
" -26.369119 \n",
" -22.953900 \n",
" -3.463010 \n",
" \n",
" \n",
" 2022-09-13 \n",
" 18.792587 \n",
" -25.430236 \n",
" -23.672206 \n",
" -2.292810 \n",
" \n",
" \n",
" 2022-09-14 \n",
" 21.200064 \n",
" -26.299390 \n",
" -23.567706 \n",
" -2.753986 \n",
" \n",
" \n",
" 2022-09-15 \n",
" 22.890536 \n",
" -27.813985 \n",
" -23.938164 \n",
" -3.195772 \n",
" \n",
" \n",
" 2022-09-16 \n",
" 23.138447 \n",
" -25.855344 \n",
" -24.390078 \n",
" -3.612660 \n",
" \n",
" \n",
" 2022-09-17 \n",
" 23.163567 \n",
" -26.157774 \n",
" -24.309178 \n",
" -3.155928 \n",
" \n",
" \n",
" 2022-09-18 \n",
" 20.973996 \n",
" -27.319631 \n",
" -22.948785 \n",
" -4.487101 \n",
" \n",
" \n",
" 2022-09-19 \n",
" 21.090756 \n",
" -26.712847 \n",
" -21.722990 \n",
" -4.110810 \n",
" \n",
" \n",
" 2022-09-20 \n",
" 21.848391 \n",
" -25.018472 \n",
" -21.850579 \n",
" -4.360523 \n",
" \n",
" \n",
" 2022-09-21 \n",
" 22.898217 \n",
" -26.005364 \n",
" -20.914269 \n",
" -5.357187 \n",
" \n",
" \n",
" 2022-09-22 \n",
" 21.978310 \n",
" -25.001244 \n",
" -20.881626 \n",
" -5.606849 \n",
" \n",
" \n",
" 2022-09-23 \n",
" 24.132628 \n",
" -25.692639 \n",
" -20.310265 \n",
" -6.258977 \n",
" \n",
" \n",
" 2022-09-24 \n",
" 23.777794 \n",
" -25.485527 \n",
" -21.305882 \n",
" -5.330284 \n",
" \n",
" \n",
" 2022-09-25 \n",
" 25.105611 \n",
" -25.485135 \n",
" -22.407657 \n",
" -6.600228 \n",
" \n",
" \n",
" 2022-09-26 \n",
" 25.207099 \n",
" -25.512208 \n",
" -23.434955 \n",
" -7.275999 \n",
" \n",
" \n",
"
\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",
" Unnamed: 0 \n",
" A \n",
" B \n",
" C \n",
" D \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 2020-01-01 \n",
" -1.397481 \n",
" -0.453722 \n",
" 1.374079 \n",
" -2.095767 \n",
" \n",
" \n",
" 1 \n",
" 2020-01-02 \n",
" -1.363418 \n",
" 0.529293 \n",
" 0.178497 \n",
" -2.364989 \n",
" \n",
" \n",
" 2 \n",
" 2020-01-03 \n",
" -2.047267 \n",
" -0.333020 \n",
" 0.379978 \n",
" -2.628204 \n",
" \n",
" \n",
" 3 \n",
" 2020-01-04 \n",
" -2.305870 \n",
" -0.145598 \n",
" -0.232491 \n",
" -2.812290 \n",
" \n",
" \n",
" 4 \n",
" 2020-01-05 \n",
" -1.851390 \n",
" -1.378215 \n",
" -1.202399 \n",
" -4.574516 \n",
" \n",
" \n",
" 5 \n",
" 2020-01-06 \n",
" -3.438928 \n",
" -0.779975 \n",
" -1.864979 \n",
" -5.666847 \n",
" \n",
" \n",
" 6 \n",
" 2020-01-07 \n",
" -4.201270 \n",
" -0.827366 \n",
" -0.796513 \n",
" -5.267628 \n",
" \n",
" \n",
" 7 \n",
" 2020-01-08 \n",
" -5.682762 \n",
" -1.009404 \n",
" -0.760801 \n",
" -4.696243 \n",
" \n",
" \n",
" 8 \n",
" 2020-01-09 \n",
" -4.362126 \n",
" -0.768552 \n",
" -0.747517 \n",
" -5.562345 \n",
" \n",
" \n",
" 9 \n",
" 2020-01-10 \n",
" -5.226357 \n",
" -1.791920 \n",
" 0.290504 \n",
" -5.214061 \n",
" \n",
" \n",
" 10 \n",
" 2020-01-11 \n",
" -4.429691 \n",
" -2.026951 \n",
" -0.821212 \n",
" -6.621030 \n",
" \n",
" \n",
" 11 \n",
" 2020-01-12 \n",
" -4.222744 \n",
" -2.875169 \n",
" -0.654313 \n",
" -5.926621 \n",
" \n",
" \n",
" 12 \n",
" 2020-01-13 \n",
" -2.413314 \n",
" -3.329878 \n",
" -1.595397 \n",
" -5.585677 \n",
" \n",
" \n",
" 13 \n",
" 2020-01-14 \n",
" -2.769944 \n",
" -3.536045 \n",
" -1.463671 \n",
" -5.098753 \n",
" \n",
" \n",
" 14 \n",
" 2020-01-15 \n",
" -3.599683 \n",
" -4.973067 \n",
" -3.859425 \n",
" -5.823875 \n",
" \n",
" \n",
" 15 \n",
" 2020-01-16 \n",
" -3.486154 \n",
" -4.792330 \n",
" -2.866047 \n",
" -6.312086 \n",
" \n",
" \n",
" 16 \n",
" 2020-01-17 \n",
" -4.232714 \n",
" -5.082053 \n",
" -3.572924 \n",
" -8.478300 \n",
" \n",
" \n",
" 17 \n",
" 2020-01-18 \n",
" -5.346857 \n",
" -5.787422 \n",
" -4.313125 \n",
" -8.595854 \n",
" \n",
" \n",
" 18 \n",
" 2020-01-19 \n",
" -5.720494 \n",
" -5.620498 \n",
" -3.699862 \n",
" -9.678113 \n",
" \n",
" \n",
" 19 \n",
" 2020-01-20 \n",
" -5.264735 \n",
" -4.938944 \n",
" -2.354040 \n",
" -8.942524 \n",
" \n",
" \n",
" 20 \n",
" 2020-01-21 \n",
" -5.407854 \n",
" -5.379811 \n",
" -2.284447 \n",
" -8.068545 \n",
" \n",
" \n",
" 21 \n",
" 2020-01-22 \n",
" -5.793401 \n",
" -5.501279 \n",
" -2.254013 \n",
" -7.997644 \n",
" \n",
" \n",
" 22 \n",
" 2020-01-23 \n",
" -6.796539 \n",
" -4.692782 \n",
" -2.330458 \n",
" -7.449650 \n",
" \n",
" \n",
" 23 \n",
" 2020-01-24 \n",
" -7.502072 \n",
" -4.085084 \n",
" -1.810495 \n",
" -6.540544 \n",
" \n",
" \n",
" 24 \n",
" 2020-01-25 \n",
" -7.639024 \n",
" -3.791416 \n",
" 1.214301 \n",
" -7.599166 \n",
" \n",
" \n",
" 25 \n",
" 2020-01-26 \n",
" -7.783544 \n",
" -2.180918 \n",
" 1.628560 \n",
" -7.928116 \n",
" \n",
" \n",
" 26 \n",
" 2020-01-27 \n",
" -7.673699 \n",
" -3.485888 \n",
" 0.640970 \n",
" -8.124872 \n",
" \n",
" \n",
" 27 \n",
" 2020-01-28 \n",
" -7.435098 \n",
" -4.480212 \n",
" -0.409425 \n",
" -7.943383 \n",
" \n",
" \n",
" 28 \n",
" 2020-01-29 \n",
" -6.843557 \n",
" -5.069680 \n",
" -1.650871 \n",
" -7.311741 \n",
" \n",
" \n",
" 29 \n",
" 2020-01-30 \n",
" -7.647267 \n",
" -4.115332 \n",
" -1.558887 \n",
" -6.308304 \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 970 \n",
" 2022-08-28 \n",
" 17.157914 \n",
" -23.306973 \n",
" -12.461653 \n",
" -2.478731 \n",
" \n",
" \n",
" 971 \n",
" 2022-08-29 \n",
" 18.207251 \n",
" -23.725280 \n",
" -12.912440 \n",
" -2.664828 \n",
" \n",
" \n",
" 972 \n",
" 2022-08-30 \n",
" 17.968302 \n",
" -21.485150 \n",
" -15.044877 \n",
" -4.034060 \n",
" \n",
" \n",
" 973 \n",
" 2022-08-31 \n",
" 18.933869 \n",
" -21.587237 \n",
" -16.046081 \n",
" -4.014128 \n",
" \n",
" \n",
" 974 \n",
" 2022-09-01 \n",
" 18.337284 \n",
" -21.451739 \n",
" -15.028398 \n",
" -4.147177 \n",
" \n",
" \n",
" 975 \n",
" 2022-09-02 \n",
" 18.783912 \n",
" -21.096423 \n",
" -15.506137 \n",
" -3.858413 \n",
" \n",
" \n",
" 976 \n",
" 2022-09-03 \n",
" 18.828378 \n",
" -19.514168 \n",
" -16.924864 \n",
" -2.559397 \n",
" \n",
" \n",
" 977 \n",
" 2022-09-04 \n",
" 18.570511 \n",
" -21.482747 \n",
" -17.147155 \n",
" -4.267082 \n",
" \n",
" \n",
" 978 \n",
" 2022-09-05 \n",
" 17.212119 \n",
" -22.331837 \n",
" -16.496095 \n",
" -5.990857 \n",
" \n",
" \n",
" 979 \n",
" 2022-09-06 \n",
" 15.726498 \n",
" -23.219830 \n",
" -19.321023 \n",
" -5.281962 \n",
" \n",
" \n",
" 980 \n",
" 2022-09-07 \n",
" 16.053999 \n",
" -22.681168 \n",
" -19.139536 \n",
" -5.587482 \n",
" \n",
" \n",
" 981 \n",
" 2022-09-08 \n",
" 17.335456 \n",
" -23.320514 \n",
" -21.271891 \n",
" -4.048170 \n",
" \n",
" \n",
" 982 \n",
" 2022-09-09 \n",
" 16.925567 \n",
" -24.175782 \n",
" -22.318101 \n",
" -4.890968 \n",
" \n",
" \n",
" 983 \n",
" 2022-09-10 \n",
" 18.652048 \n",
" -25.436089 \n",
" -22.213175 \n",
" -6.330027 \n",
" \n",
" \n",
" 984 \n",
" 2022-09-11 \n",
" 19.535978 \n",
" -25.673818 \n",
" -23.064392 \n",
" -5.673334 \n",
" \n",
" \n",
" 985 \n",
" 2022-09-12 \n",
" 19.632355 \n",
" -26.369119 \n",
" -22.953900 \n",
" -3.463010 \n",
" \n",
" \n",
" 986 \n",
" 2022-09-13 \n",
" 18.792587 \n",
" -25.430236 \n",
" -23.672206 \n",
" -2.292810 \n",
" \n",
" \n",
" 987 \n",
" 2022-09-14 \n",
" 21.200064 \n",
" -26.299390 \n",
" -23.567706 \n",
" -2.753986 \n",
" \n",
" \n",
" 988 \n",
" 2022-09-15 \n",
" 22.890536 \n",
" -27.813985 \n",
" -23.938164 \n",
" -3.195772 \n",
" \n",
" \n",
" 989 \n",
" 2022-09-16 \n",
" 23.138447 \n",
" -25.855344 \n",
" -24.390078 \n",
" -3.612660 \n",
" \n",
" \n",
" 990 \n",
" 2022-09-17 \n",
" 23.163567 \n",
" -26.157774 \n",
" -24.309178 \n",
" -3.155928 \n",
" \n",
" \n",
" 991 \n",
" 2022-09-18 \n",
" 20.973996 \n",
" -27.319631 \n",
" -22.948785 \n",
" -4.487101 \n",
" \n",
" \n",
" 992 \n",
" 2022-09-19 \n",
" 21.090756 \n",
" -26.712847 \n",
" -21.722990 \n",
" -4.110810 \n",
" \n",
" \n",
" 993 \n",
" 2022-09-20 \n",
" 21.848391 \n",
" -25.018472 \n",
" -21.850579 \n",
" -4.360523 \n",
" \n",
" \n",
" 994 \n",
" 2022-09-21 \n",
" 22.898217 \n",
" -26.005364 \n",
" -20.914269 \n",
" -5.357187 \n",
" \n",
" \n",
" 995 \n",
" 2022-09-22 \n",
" 21.978310 \n",
" -25.001244 \n",
" -20.881626 \n",
" -5.606849 \n",
" \n",
" \n",
" 996 \n",
" 2022-09-23 \n",
" 24.132628 \n",
" -25.692639 \n",
" -20.310265 \n",
" -6.258977 \n",
" \n",
" \n",
" 997 \n",
" 2022-09-24 \n",
" 23.777794 \n",
" -25.485527 \n",
" -21.305882 \n",
" -5.330284 \n",
" \n",
" \n",
" 998 \n",
" 2022-09-25 \n",
" 25.105611 \n",
" -25.485135 \n",
" -22.407657 \n",
" -6.600228 \n",
" \n",
" \n",
" 999 \n",
" 2022-09-26 \n",
" 25.207099 \n",
" -25.512208 \n",
" -23.434955 \n",
" -7.275999 \n",
" \n",
" \n",
"
\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
}