# Basic Data Processing with Pandas

## Note

np.nan 类似于 None，但不相等，也不相等于自己，要用特定的函数才能检测出来：

`>>> import numpy as np>>> np.nan == NoneFalse>>> np.nan == np.nanFalse>>> np.isnan(np.nan)True`

`>>> s = pd.Series(['Tiger', 'Bear', 'Moose'], index=['India', 'America', 'Canada'])>>> sIndia      TigerAmerica     BearCanada     Moosedtype: object>>> sports = {'Archery': 'Bhutan',              'Golf': 'Scotland',              'Sumo': 'Japan',              'Taekwondo': 'South Korea'}>>> s = pd.Series(sports, index=['Golf', 'Sumo', 'Hockey'])>>> sGolf      ScotlandSumo         JapanHockey         NaNdtype: object`

#### Querying a Series

• 用 numpy 里的随机数生成 series 使用代码 s = pd.Series(np.random.randint(0,1000,10000))，只显示前几个用代码 s.head()。
• 按 index 序号搜索的函数是 .iloc[0]，按 index 名称搜索的函数是 .loc[‘A’]。可以直接用 s.loc[‘A’] = ‘a’ 来给 series 增加一个值。
• s=s+2，给 series 的每一个值都 +2，相当于
`s = pd.Series(np.random.randint(0,1000,10000))for label, value in s.iteritems():    s.loc[label]= value+2`
• append 一个原来的 series 再赋值给一个新的变量，并不改变原来的 series，而是重新创造了一个 series。
`original_sports = pd.Series({'Archery': 'Bhutan',                             'Golf': 'Scotland',                             'Sumo': 'Japan',                             'Taekwondo': 'South Korea'})cricket_loving_countries = pd.Series(['Australia',                                      'Barbados',                                      'Pakistan',                                      'England'],                                    index=['Cricket',                                          'Cricket',                                          'Cricket',                                          'Cricket'])all_countries = original_sports.append(cricket_loving_countries)`

output:

`Archery           BhutanGolf            ScotlandSumo               JapanTaekwondo    South Koreadtype: object`

#### The DataFrame Data Structure

`import pandas as pdpurchase_1 = pd.Series({'Name': 'Chris',                        'Item Purchased': 'Dog Food',                        'Cost': 22.50})purchase_2 = pd.Series({'Name': 'Kevyn',                        'Item Purchased': 'Kitty Litter',                        'Cost': 2.50})purchase_3 = pd.Series({'Name': 'Vinod',                        'Item Purchased': 'Bird Seed',                        'Cost': 5.00})df = pd.DataFrame([purchase_1, purchase_2, purchase_3], index=['Store 1', 'Store 1', 'Store 2'])df`

output:

`Cost Item Purchased   NameStore 1  22.5       Dog Food  ChrisStore 1   2.5   Kitty Litter  KevynStore 2   5.0      Bird Seed  Vinod`

`df.loc['Store 2']df.loc['Store 1', 'Cost']df.loc['Store 1']['Cost']    # 用上面的更高效df.T    #转置df.T.loc['Cost']    # 搜索行坐标需要加 .loc[]df['Cost']    # 搜索列坐标不需要加 .loc[]df.loc[:,['Name', 'Cost']]`
• 删除行／列：drop 语句。df.drop(‘Store 1’) 并不删除 Store 1 那一行，而是返回一个 copy。想要有一个删除的 DataFrame，使用语句 copy_df = df.copy() 和 copy_df = copy_df.drop(‘Store 1’)。drop 语句有个参数 axis，默认是 0，表示 row axis；如果 axis = 1，就表示 column。
• 删除列：del 语句。例如 del copy_df[‘Name’] 可以删掉 Name 那一列。
• 添加行：df.loc[‘Location’] = None
• 添加列：df[‘Location’] = None

• 读取 csv 文件：df = pd.read_csv(‘olympics.csv’)；如果让行和列的第一排不是 0、1、2… 的数字，就要用 df = pd.read_csv(‘olympics.csv’, index_col = 0, skiprows=1)，说明第 0 列当作 index，并且直接从第一行开始
• df.column 可以显示第一排所有的 column 名称，改名使用函数 DataFrame.rename(index=None, columns=None, kwargs)，例如 df.rename(columns={col:’Gold’}, inplace=True)。Inplace: whether to return a new DataFrame. If True then value of copy is ignored. Default = False.

#### Querying a DataFrame

• Boolean Mask: 它和 DataFrame 重叠，可以把 False 的部分变成 NaN 或者直接删去。格式例如：df[‘Gold’] > 0
• only_gold = df.where(df[‘Gold’] > 0) 在 where 函数里加 Boolean Mask 可以将不符合的变成 NaN，再用 .dropna() 函数去除掉 NaN 值，效果与 only_gold = df[df[‘Gold’] > 0] 相同，在 df （不带 .where）里放入 Boolean Mask。

#### Indexing DataFrames

• 把原来的 index （行）变成列标：df[‘new_name’] = df.index
• 设置新的 index：df = df.set_index(‘A’)，这个 A 要是原来列名里有的，或者 df = df.set_index([‘A’, ‘B’])
• 重置 index，变成 0、1、2…：df = df.reset_index()
• 选出一列里不重复的元素 df[‘column_name’].unique()
• 给 index 重新命名： df.index.names = [‘Location’, ‘Name’]，显然这里有两个 index。
• 往 DataFrames 里加新元素：df = df.append(pd.Series(data={‘Cost’: 3.00, ‘Item Purchased’: ‘Kitty Food’}, name=(‘Store 2’, ‘Kevyn’)))，name 里的两个是 index 的值，等于是根据这个 index(name) 的值往里加了个 series。
• 对 index 里的值排序：.sort_index()。

#### Missing Values

`df.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)`

method : (’backfill’, ‘bfill’, ‘pad’, ‘ffill’, None), default None

Method to use for filling holes in reindexed Series

pad / ffill: propagate last valid observation forward to next valid

backfill / bfill: use NEXT valid observation to fill gap

axis : (0, 1, ‘index’, ‘columns’)

#### Other querying

• df[‘column_name’].idxmax() 输出某一个 column 最大值所在的 index 的名字。df[‘column_name’].argmax() 是它的 Series 版本。
• df[‘column_name_C’] = df[‘column_name_A’] + df[‘column_name_B’] 通过这个代码可以给 DataFrame 增加一列。
• df.max(axis = 0) 用来求每一列的最大值，返回值是一行，所以 axis = 0；同理，df.max(axis = 1) 用来求每一行的最大值。
• df[‘column_name’].str.startswith(‘abc’)) 用来判断某一列里的字符串变量是不是以 ‘abc’ 开头，返回一个 boolean mask。
• df.apply((func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds) 以及 GroupBy.apply(func, *args, **kwargs)，用来进行整体的函数处理。
• Series.apply: Series.apply(func, convert_dtype=True, args=(), **kwds)
• Groupby.apply: GroupBy.apply(func, *args, **kwargs)
• DataFrame.apply: DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)
A single golf clap? Or a long standing ovation?

By clapping more or less, you can signal to us which stories really stand out.