Basic Data Processing with Pandas

The Series Data Structure

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

>>> import numpy as np
>>> np.nan == None
False
>>> np.nan == np.nan
False
>>> np.isnan(np.nan)  # `df.isnull` in DataFrame
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.columns 可以显示第一排所有的 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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容