Basic Data Processing with Pandas

Note

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

>>> import numpy as np
>>> np.nan == None
False
>>> np.nan == np.nan
False
>>> np.isnan(np.nan)
True

建立一个 series,可以手动输入 index,不然就是 1、2、3(直接导入 list),如果 index 在 dictionary 里没有的话,建立 series 以后它对应的值就是 NaN:

>>> s = pd.Series(['Tiger', 'Bear', 'Moose'], index=['India', 'America', 'Canada'])
>>> s
India Tiger
America Bear
Canada Moose
dtype: object

>>> sports = {'Archery': 'Bhutan',
'Golf': 'Scotland',
'Sumo': 'Japan',
'Taekwondo': 'South Korea'}
>>> s = pd.Series(sports, index=['Golf', 'Sumo', 'Hockey'])
>>> s
Golf Scotland
Sumo Japan
Hockey NaN
dtype: 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           Bhutan
Golf Scotland
Sumo Japan
Taekwondo South Korea
dtype: object

The DataFrame Data Structure

import pandas as pd
purchase_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   Name
Store 1 22.5 Dog Food Chris
Store 1 2.5 Kitty Litter Kevyn
Store 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

DataFrame Indexing and Loading

  • 读取 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.