美文网首页
Basic Data Processing with Panda

Basic Data Processing with Panda

作者: 豊小乂 | 来源:发表于2017-08-13 13:34 被阅读0次

    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)

    相关文章

      网友评论

          本文标题:Basic Data Processing with Panda

          本文链接:https://www.haomeiwen.com/subject/xcxerxtx.html