• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Python數據科學入門(Pandas玩轉數據)- 筆記03

    標簽: python

    Python數據科學入門(Pandas玩轉數據)

    慕課網數據科學入門課程學習筆記

    一、Series和DataFrame的簡單數學運算

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame

    1.Series 相加

    s1 = Series([1,2,3],index=['A','B','C'])
    s1
    A 1 B 2 C 3 dtype: int64
    s2 = Series([4,5,6,7],index=['B','C','D','E'])
    s2
    B 4 C 5 D 6 E 7 dtype: int64
    # 對應的 index 的值相加,沒有 nan + 非 nan還是nan
    s1 + s2     
    A NaN B 6.0 C 8.0 D NaN E NaN dtype: float64

    2.Dataframe運算

    df1 = DataFrame(np.arange(4).reshape(2,2),index=['A','B'],columns=['AA','BB'])
    df1
    AA BB
    A 0 1
    B 2 3
    df2 = DataFrame(np.arange(9).reshape(3,3),index=['A','B','C'],columns=['AA','BB','CC'])
    df2
    AA BB CC
    A 0 1 2
    B 3 4 5
    C 6 7 8
    #加法運算
    df1 + df2
    AA BB CC
    A 0.0 2.0 NaN
    B 5.0 7.0 NaN
    C NaN NaN NaN
    df3 = DataFrame([[1,2,3],[4,5,np.nan],[7,8,9]],
                    index=['A','B','C'],columns=['c1','c2','c3'])
    df3
    c1 c2 c3
    A 1 2 3.0
    B 4 5 NaN
    C 7 8 9.0
    # 默認列和    這里的 nan 被忽略
    # axis = 1 時求 行和
    df3.sum()
    c1 12.0 c2 15.0 c3 12.0 dtype: float64
    # min() max()  默認求列
    df3.min()
    c1 1.0 c2 2.0 c3 3.0 dtype: float64
    df3.describe()
    c1 c2 c3
    count 3.0 3.0 2.000000
    mean 4.0 5.0 6.000000
    std 3.0 3.0 4.242641
    min 1.0 2.0 3.000000
    25% 2.5 3.5 4.500000
    50% 4.0 5.0 6.000000
    75% 5.5 6.5 7.500000
    max 7.0 8.0 9.000000

    二、Series和DataFrame的排序

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame

    1.Series排序

    s1 = Series(np.random.randn(10))
    s1
    0 0.773184 1 -0.403266 2 0.980296 3 -0.631971 4 0.636405 5 0.732921 6 0.756932 7 -0.597943 8 -1.152224 9 0.771753 dtype: float64
    # 按照values 排序 默認升序
    # ascending=False  降序
    s1.sort_values()
    8 -1.152224 3 -0.631971 7 -0.597943 1 -0.403266 4 0.636405 5 0.732921 6 0.756932 9 0.771753 0 0.773184 2 0.980296 dtype: float64
    # 按照index 排序 默認升序
    # ascending=False  降序
    s1.sort_index(ascending=False)
    9 0.771753 8 -1.152224 7 -0.597943 6 0.756932 5 0.732921 4 0.636405 3 -0.631971 2 0.980296 1 -0.403266 0 0.773184 dtype: float64

    2.DataFrame排序

    df1 = DataFrame(np.random.randn(20).reshape(4,5),columns=['a','b','c','d','e'])
    df1
    a b c d e
    0 0.173908 -0.978290 -0.791529 -1.769024 -1.971549
    1 0.553871 -1.436033 -1.348179 0.244897 1.465071
    2 1.378478 -0.869294 0.797711 -0.539044 -1.211413
    3 2.739525 -0.111984 -1.468831 1.418846 0.182972
    #   按照 a 列排序
    # 默認 升序  ascending=False 降序
    # 默認 axis=0 針對列 
    df1.sort_values('a',ascending=False)
    a b c d e
    3 2.739525 -0.111984 -1.468831 1.418846 0.182972
    2 1.378478 -0.869294 0.797711 -0.539044 -1.211413
    1 0.553871 -1.436033 -1.348179 0.244897 1.465071
    0 0.173908 -0.978290 -0.791529 -1.769024 -1.971549

    三、重命名DataFrame的index

    import numpy as np
    import pandas as pa
    from pandas import Series,DataFrame

    1.重命名 index

    df1 = DataFrame(np.arange(9).reshape(3,3),index=['A','B','C'],columns=['AA','BB','CC'])
    df1
    AA BB CC
    A 0 1 2
    B 3 4 5
    C 6 7 8
    #重新給index賦值
    df1.index=Series(['a','b','c'])
    df1
    .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
    AA BB CC
    a 0 1 2
    b 3 4 5
    c 6 7 8
    #  map 方法
    df1.index = df1.index.map(str.upper)
    df1
    # rename 方法
    df1.rename(index=str.lower,columns=str.lower)
    .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
    aa bb cc
    a 0 1 2
    b 3 4 5
    c 6 7 8
    df1
    .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
    AA BB CC
    A 0 1 2
    B 3 4 5
    C 6 7 8
    # 通過字典 對特定的index修改
    # 更多 查看文檔
    df1.rename(index={'A':'g'})
    AA BB CC
    g 0 1 2
    B 3 4 5
    C 6 7 8

    2.復習

    list1 = [1,2,3,4]
    list2 = ['1','2','3','4']
    # 將 list1 元素轉換為 字符串
    [str(x) for x in list1]
    [‘1’, ‘2’, ‘3’, ‘4’]
    # map 方法轉換
    list(map(str,list1))
    [‘1’, ‘2’, ‘3’, ‘4’]

    3.寫一個自己的 map

    def test_map(x):
        return x + '_ABC'
    df1.index.map(test_map)
    Index([‘A_ABC’, ‘B_ABC’, ‘C_ABC’], dtype=’object’)
    df1.rename(index=test_map)
    AA BB CC
    A_ABC 0 1 2
    B_ABC 3 4 5
    C_ABC 6 7 8

    四、DataFrame 的merge(合并)操作

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    df1 = DataFrame({'key':['X','Y','Z'],'data_set_1':[1,2,3]})
    df1
    key data_set_1
    0 X 1
    1 Y 2
    2 Z 3
    df2 = DataFrame({'key':['X','X','C'],'data_set_2':[4,5,6]})
    df2
    key data_set_2
    0 X 4
    1 X 5
    2 C 6
    # 默認會去找 兩個 df 都有的 key
    # 可通過 on = ? 指定
    # how=inner/left/outer/right  等參數查看文檔
    #   df1 和 df2 都有 key
    pd.merge(df1,df2)
    key data_set_1 data_set_2
    0 X 1 4
    1 X 1 5
    # left 去掉右邊df2 “多余”
    pd.merge(df1,df2,on='key',how='left')
    key data_set_1 data_set_2
    0 X 1 4.0
    1 X 1 5.0
    2 Y 2 NaN
    3 Z 3 NaN
    # right 去掉左邊df1 “多余”
    pd.merge(df1,df2,on='key',how='right')
    key data_set_1 data_set_2
    0 X 1.0 4
    1 X 1.0 5
    2 C NaN 6
    # outer 像是 left 和 right 的結合  都保留
    pd.merge(df1,df2,on='key',how='outer')
    key data_set_1 data_set_2
    0 X 1.0 4.0
    1 X 1.0 5.0
    2 Y 2.0 NaN
    3 Z 3.0 NaN
    4 C NaN 6.0

    五、Concatenaten和Combine

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame

    1>Concatenaten

    1.Numpy array

    arr1 = np.arange(9).reshape(3,3)
    arr1
    array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
    arr2 = np.arange(9).reshape(3,3)
    arr2
    array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
    # concatenate 默認 axis=0 豎著連接
    np.concatenate([arr1,arr2])
    array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 1, 2], [3, 4, 5], [6, 7, 8]])

    2.Series

    s1 = Series([1,2,3],index=['X','Y','Z'])
    s2 = Series([4,5],index=['A','B'])
    
    pd.concat([s1,s2])
    X 1 Y 2 Z 3 A 4 B 5 dtype: int64
    
    pd.concat([s1,s2],axis=1)
    0 1
    A NaN 4.0
    B NaN 5.0
    X 1.0 NaN
    Y 2.0 NaN
    Z 3.0 NaN

    3.DataFrame

    df1 = DataFrame(np.random.randn(4,3),columns=['X','Y,','Z'])
    df1
    X Y, Z
    0 0.542921 1.710888 1.027810
    1 0.624385 -0.825916 0.893589
    2 -1.000241 2.551461 1.541975
    3 0.020806 0.635956 0.573629
    df2 = DataFrame(np.random.randn(3,3),columns=['X','Y,','A'])
    df2
    X Y, A
    0 -0.721702 -0.106360 -1.701335
    1 0.591009 0.233578 0.212189
    2 0.855895 -1.831944 0.247578
    pd.concat([df1,df2])
    A X Y, Z
    0 NaN 0.542921 1.710888 1.027810
    1 NaN 0.624385 -0.825916 0.893589
    2 NaN -1.000241 2.551461 1.541975
    3 NaN 0.020806 0.635956 0.573629
    0 -1.701335 -0.721702 -0.106360 NaN
    1 0.212189 0.591009 0.233578 NaN
    2 0.247578 0.855895 -1.831944 NaN

    2> Combine

    1.Series

    s1 = Series([2,np.nan,4,np.nan],index=['A','B','C','D'])
    s1
    A 2.0 B NaN C 4.0 D NaN dtype: float64
    s2 = Series([1,2,3,4],index=['A','B','C','D'])
    s2
    A 1 B 2 C 3 D 4 dtype: int64
    # s1 中的 nan 被 s2 填充
    s1.combine_first(s2)
    A 2.0 B 2.0 C 4.0 D 4.0 dtype: float64

    2.DataFrame

    df1 = DataFrame({'X':[1, np.nan, 3, np.nan],
                    'Y':[5, np.nan, 7, np.nan],
                    'Z':[9, np.nan, 11, np.nan]})
    df1
    X Y Z
    0 1.0 5.0 9.0
    1 NaN NaN NaN
    2 3.0 7.0 11.0
    3 NaN NaN NaN
    df2 = DataFrame({'Z':[np.nan, 10, np.nan, 12],
                    'A':[1,2,3,4],})
    df2
    Z A
    0 NaN 1
    1 10.0 2
    2 NaN 3
    3 12.0 4
    # df1 里的 nan 被 df2 填充
    df1.combine_first(df2)
    A X Y Z
    0 1.0 1.0 5.0 9.0
    1 2.0 NaN NaN 10.0
    2 3.0 3.0 7.0 11.0
    3 4.0 NaN NaN 12.0

    六、通過apply進行數據預處理

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    df = pd.read_csv('data.csv')
    df.head()
    time data
    0 1124352.0 AA: BB: CC: DD
    1 1124352.0 AA: BB: CC: DD
    2 1124352.0 AA: BB: CC: DD
    3 1124353.0 AA: BB: CC: DD
    4 1124353.0 AA: BB: CC: DD
    df.size
    190
    s1 = Series(['a']*190)
    df['A'] = s1
    df.head()
    time data A
    0 1124352.0 AA: BB: CC: DD a
    1 1124352.0 AA: BB: CC: DD a
    2 1124352.0 AA: BB: CC: DD a
    3 1124353.0 AA: BB: CC: DD a
    4 1124353.0 AA: BB: CC: DD a
    # apply() 對一列操作
    df['A'] = df['A'].apply(str.upper)
    df.head()
    time data A
    0 1124352.0 AA: BB: CC: DD A
    1 1124352.0 AA: BB: CC: DD A
    2 1124352.0 AA: BB: CC: DD A
    3 1124353.0 AA: BB: CC: DD A
    4 1124353.0 AA: BB: CC: DD A

    將data分割多列

    # 以空格分割  
    df['data'][0].split(' ')
    [”, ‘AA:’, ‘BB:’, ‘CC:’, ‘DD’]
    # 去掉空格干擾
    list_1 = df['data'][0].strip().split(' ')
    list_1
    [‘AA:’, ‘BB:’, ‘CC:’, ‘DD’]

    要求:將第2列和第4列取出重新放入data列

    使用 head() 需要注意,如果對 df 操作時使用1了 head()會使只操作了前幾行

    使用 head() 來查看就好

    list_1[1],list_1[3]
    (‘BB:’, ‘DD’)
    def foo(line):
    
        items = line.strip().split(' ')
        return Series([items[1],items[3]])
    df_tmp = df['data'].apply(foo)
    df_tmp.head()
    0 1
    0 BB: DD
    1 BB: DD
    2 BB: DD
    3 BB: DD
    4 BB: DD
    df_tmp = df_tmp.rename(columns={0:"B",1:"D"})
    df_tmp.head()
    B D
    0 BB: DD
    1 BB: DD
    2 BB: DD
    3 BB: DD
    4 BB: DD
    df.head()
    time data A
    0 1124352.0 AA: BB: CC: DD A
    1 1124352.0 AA: BB: CC: DD A
    2 1124352.0 AA: BB: CC: DD A
    3 1124353.0 AA: BB: CC: DD A
    4 1124353.0 AA: BB: CC: DD A
    # 連接操作
    df_new = df.combine_first(df_tmp)
    df_new.head()
    A B D data time
    0 A BB: DD AA: BB: CC: DD 1124352.0
    1 A BB: DD AA: BB: CC: DD 1124352.0
    2 A BB: DD AA: BB: CC: DD 1124352.0
    3 A BB: DD AA: BB: CC: DD 1124353.0
    4 A BB: DD AA: BB: CC: DD 1124353.0
    # 刪除一些不需要的列
    del df_new['A']
    del df_new['data']
    df_new.head()
    B D time
    0 BB: DD 1124352.0
    1 BB: DD 1124352.0
    2 BB: DD 1124352.0
    3 BB: DD 1124353.0
    4 BB: DD 1124353.0
    # 存儲 df_new.csv
    df_new.to_csv('df_new.csv')
    ——–

    七、通過去重清洗數據

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    df = pd.read_csv('data.csv')
    df.head()
    time data
    0 1124352 AA: BB: CC: DD
    1 1124352 AA: BB: CC: DD
    2 1124352 AA: BB: CC: DD
    3 1124353 AA: BB: CC: DD
    4 1124353 FF: BB: CC: DD
    df.size
    190
    len(df)
    95
    # 查看 time 列 不重復的數據 的數量
    len(df['time'].unique())
    22

    去重

    # 判重 的方法
    df['time'].duplicated().head()
    0 False 1 True 2 True 3 False 4 True Name: time, dtype: bool
    # 對 duplicated() 方法返回 True 的數據刪掉,達到去重
    df_new = df.drop_duplicates()
    df_new.head()
    time data
    0 1124352 AA: BB: CC: DD
    3 1124353 AA: BB: CC: DD
    4 1124353 FF: BB: CC: DD
    6 1124354 AA: BB: CC: DD
    7 1124354 CC: BB : CC: DD
    #  以 data 列為標準來刪除重復,keep='last' 表示保存最后一個
    df_new = df.drop_duplicates({'data'},keep='last')
    df_new.head()
    time data
    4 1124353 FF: BB: CC: DD
    7 1124354 CC: BB : CC: DD
    94 1124373 AA: BB: CC: DD

    八、時間序列的操作基礎

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    from datetime import datetime
    t1 = datetime(2009,10,20)
    t1
    datetime.datetime(2009, 10, 20, 0, 0)
    date_list = [
        datetime(2016,9,1),
        datetime(2016,9,10),
        datetime(2017,9,1),
        datetime(2017,9,10),
        datetime(2017,10,1)
    ]
    date_list
    [datetime.datetime(2016, 9, 1, 0, 0), datetime.datetime(2016, 9, 10, 0, 0), datetime.datetime(2017, 9, 1, 0, 0), datetime.datetime(2017, 9, 10, 0, 0), datetime.datetime(2017, 10, 1, 0, 0)]
    s1 = Series(np.random.rand(5),index=date_list)
    s1
    2016-09-01 0.497374 2016-09-10 0.686276 2017-09-01 0.788562 2017-09-10 0.765383 2017-10-01 0.546197 dtype: float64
    s1[1]
    0.6862758320157275
    s1[datetime(2016,9,10)]
    0.6862758320157275
    s1['2016-9-10']
    0.6862758320157275
    s1['20160910']
    0.6862758320157275
    s1['2016-9']
    2016-09-01 0.497374 2016-09-10 0.686276 dtype: float64
    s1['2017']
    2017-09-01 0.788562 2017-09-10 0.765383 2017-10-01 0.546197 dtype: float64
    # date_range(start,end,periods...)  隨機生成時間 
    # freq = 'D/W/'  D 間隔為 天   
    # W間隔為周,W-MON 從周一開始(默認從周日開始)默認 D
    # H 間隔為 小時  5H 間隔為 5小時
    date_list_new = pd.date_range(start='2017-01-01',periods=10)
    date_list_new
    DatetimeIndex([‘2017-01-01’, ‘2017-01-02’, ‘2017-01-03’, ‘2017-01-04…)
    s2 = Series(np.random.rand(10),index=date_list_new)
    s2
    2017-01-01 0.152626 2017-01-02 0.590219 … Freq: D, dtype: float64 ——

    九、時間序列數據的采樣和畫圖

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    t_range = pd.date_range('2016-01-01','2016-12-01')
    t_range
    DatetimeIndex([‘2016-01-01’, ‘2016-01-02’, ‘2016-01-03’, ‘2016-01-04’, ‘2016-01-05’, ‘2016-01-06’, ‘2016-01-07’, ‘2016-01- ….)
    s1 = Series(np.random.randn(len(t_range)),index=t_range)
    s1.head()
    2016-01-01    0.145550
    2016-01-02    2.444428
    ...
    Freq: D, dtype: float64
    

    采樣

    #  t_range 是每天一個數據,下面要求每月一個數據
    # 要求 計算每個月的 平均值 
    s1['2016-01'].mean()
    -0.14446619115276657
    # shift + tab 鍵查看方法說明
    # M 月 H 小時
    s1_month = s1.resample('M').mean()
    s1_month.head()
    2016-01-31   -0.144466
    2016-02-29    0.083245
    2016-03-31    0.204149
    
    Freq: M, dtype: float64
    

    數據填充

    # ffill() 往前填充
    s1_test = s1.resample('H').ffill()
    s1_test.head()
    2016-01-01 00:00:00 0.14555 2016-01-01 01:00:00 0.14555 2016-01-01 02:00:00 0.14555 2016-01-01 03:00:00 0.14555 2016-01-01 04:00:00 0.14555 Freq: H, dtype: float64
    # bfill() 往后填充
    s1_test = s1.resample('H').bfill()
    s1_test.head()
    2016-01-01 00:00:00    0.145550
    2016-01-01 01:00:00    2.444428
    2016-01-01 02:00:00    2.444428
    2016-01-01 03:00:00    2.444428
    2016-01-01 04:00:00    2.444428
    Freq: H, dtype: float64
    

    簡單畫圖

    t_range = pd.date_range('2016-01-01','2016-12-31',freq='H')
    t_range
    DatetimeIndex(['2016-01-01 00:00:00', '2016-01-01 01:00:00',
                   '2016-01-01 02:00:00', '2016-01-01 03:00:00',
                   '2016-01-01 04:00:00', '2016-01-01 05:00:00',
                   '2016-01-01 06:00:00', '2016-01-01 07:00:00',
                   '2016-01-01 08:00:00', '2016-01-01 09:00:00',
                   ...
             )
    
    stock_df = DataFrame(index=t_range)
    stock_df.head(10)
    2016-01-01 00:00:00
    2016-01-01 01:00:00
    2016-01-01 02:00:00
    2016-01-01 03:00:00
    2016-01-01 04:00:00
    2016-01-01 05:00:00
    stock_df['data1'] = np.random.randint(80,160,size=len(t_range))
    stock_df.head(10)
    data1
    2016-01-01 00:00:00 147
    2016-01-01 01:00:00 147
    2016-01-01 02:00:00 159
    2016-01-01 03:00:00 99
    2016-01-01 04:00:00 119
    2016-01-01 05:00:00 136
    2016-01-01 06:00:00 102
    stock_df['data2'] = np.random.randint(40,140,size=len(t_range))
    stock_df.head(10)
    data1 data2
    2016-01-01 00:00:00 147 44
    2016-01-01 01:00:00 147 93
    2016-01-01 02:00:00 159 81
    2016-01-01 03:00:00 99 108
    2016-01-01 04:00:00 119 55
    2016-01-01 05:00:00 136 106
    stock_df.plot()
    <matplotlib.axes._subplots.AxesSubplot at 0x249d416d438>
    

    import matplotlib.pyplot as plt
    plt.show()

    按周取樣再繪圖

    weekly_df = DataFrame()
    weekly_df['data1'] = stock_df['data1'].resample('W').mean()
    weekly_df['data2'] = stock_df['data2'].resample('W').mean()
    weekly_df.head()
    data1 data2
    2016-01-03 119.000000 85.111111
    2016-01-10 119.095238 90.345238
    weekly_df.plot()
    plt.show()


    十、數據分箱技術-Binning

    什么是數據分箱?

    例如 不同大小的蘋果分裝在不同的箱子

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    score_list = np.random.randint(0,100,size=20)
    score_list
    array([87, 83, 40, 14, 4, 31, 46, 17, 96, 99, 39, 4, 85, 8, 64, 82, 32, 28, 36, 40])
    bins = [0,59,70,80,100]

    數據分箱

    # cut(array,list)  將array里的數據按list區間劃分 
    score_cut = pd.cut(score_list,bins)
    score_cut
    [(80, 100], (80, 100], (0, 59], (0, 59], (0, 59], …, (80, 100], (0, 59], (0, 59], (0, 59], (0, 59]] Length: 20 Categories (4, interval[int64]): [(0, 59]
    # value_counts() 統計各個 數值區間的 個數
    pd.value_counts(score_cut)
    (0, 59] 13 (80, 100] 6 (59, 70] 1 (70, 80] 0 dtype: int64
    df = DataFrame()
    df['score'] = score_list
    df['student'] = [pd.util.testing.rands(3) for i in range(20)]
    df.head()
    score student
    0 87 w5S
    1 83 cQX
    2 40 JYH
    3 14 Cs3
    4 4 niX

    數據分箱 cut()函數

    cut(數據,區間-list,labels=[‘各區間的表示標簽’,’…’])

    
    df['Categories'] = pd.cut(df['score'],bins,labels=['Low','OK','Good','Great'])
    df.head()
    score student Categories
    0 87 w5S Great
    1 83 cQX Great
    2 40 JYH Low
    3 14 Cs3 Low
    4 4 niX Low

    十一、數據分組技術-GroupBy

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame

    原理類似SQL

    df = pd.read_csv('weather.csv')
    df.head()
    date city temperature wind
    0 2017/1/1 GZ 12 3
    1 2017/1/8 BJ 2 5
    2 2017/1/15 SH -4 6
    3 2017/1/22 GZ 6 1
    4 2017/1/29 BJ 13 3

    分組

    g = df.groupby(df['city'])
    g
    # 查看分組情況  哪一列 哪些組
    g.groups
    {‘BJ’: Int64Index([1, 4, 7, 10, 13, 16, 19, 22, 25, 28], dtype=’int64’), ‘GZ’: Int64Index([0, 3, 6, 9, 12, 15, 18, 21, 24, 27], dtype=’int64’), ‘SH’: Int64Index([2, 5, 8, 11, 14, 17, 20, 23, 26], dtype=’int64’)}
    #查看某組
    g_gz = g.get_group('GZ')
    g_gz.head()
    date city temperature wind
    0 2017/1/1 GZ 12 3
    3 2017/1/22 GZ 6 1
    6 2017/2/12 GZ 12 5
    9 2017/3/5 GZ 6 9
    12 2017/3/26 GZ 12 6
    # 求gz的平均值
    g_gz.mean()
    temperature 9.0 wind 4.5 dtype: float64
    # 求整個組的平均值
    g.mean()
    temperature wind
    city
    BJ 7.500000 4.5
    GZ 9.000000 4.5
    SH -1.333333 4.0

    十二、數據聚合技術Aggregation

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    df = pd.read_csv('weather.csv')
    g = df.groupby('city')

    聚合

    mean() count() max() 等都是聚合

    # g.agg('min')  就是 g.min()  其他類似
    g.agg('min')
    date temperature wind
    city
    BJ 2017/1/29 2 1
    GZ 2017/1/1 6 1
    SH 2017/1/15 -4 1

    自定義函數 來聚合

    def foo(attr):
        return attr.max() - attr.min()
    g.agg(foo)
    temperature wind
    city
    BJ 11 8
    GZ 6 8
    SH 6 6

    多columns分組

    g_new = df.groupby(['city','wind'])
    g_new.groups
    {(‘BJ’, 1): Int64Index([13], dtype=’int64’), (‘BJ’, 2): Int64Index([25], dtype=’int64’), (‘BJ’, 3): Int64Index([4, 10], dtype=’int64’), (‘BJ’, 4): Int64Index([7], dtype=’int64’), ……}
    g_new.get_group(('BJ',3))
    date city temperature wind
    4 2017/1/29 BJ 13 3
    10 2017/3/12 BJ 13 3

    對多 columns 遍歷需要注意

    for (name_1,name_2),group in g_new:
        print(name_1,name_2)
        print(group)
    BJ 1
            date city  temperature  wind
    13  2017/4/2   BJ            2     1
    BJ 2
             date city  temperature  wind
    25  2017/6/25   BJ            2     2
    

    …..


    十三、透視表

    透視表概念來自Excel,為了更好展示數據,對原來的行列進行了一些變化,根據這些變化,相應的數據也變化

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame

    無數據源 不演示了

    # 讀取excel文件數據
    df = pd.read_excel()
    # 生成數據透視表,index 對哪一列進行透視
    # values 接收一些想要說的數據
    pd.pivot_table(df,index=[''],...)
    版權聲明:本文為iflytop原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/iflytop/article/details/80554522

    智能推薦

    python學習筆記03

    函數 我們去餐廳吃飯,跟服務員點了菜,過了一會兒,服務員把做好的菜端上來。餐廳的廚房就可以看作是一個函數,我們點的菜單,就是給這個函數的參數;廚師在廚房里做菜的過程就是這個函數的執行過程;做好的菜是返回結果,返回到我們的餐桌上。 isEqual函數 函數可以把某個功能的代碼分離出來, 在需要的時候重復使用,就像拼裝積木一樣, 這會讓程序結構更清晰。 if...elif...else 改寫isEqu...

    python學習筆記03

    Hello,新的一天,你學習了嗎? 文章目錄 1.if語句 1.1一個簡單的嘗試 1.2檢測是否相等 1.3檢測是否不相等 2.比較數字 3.檢查多個條件 3.1“與”關系 3.2“或”關系 4.檢測特定值是否在列表中 5.檢測特定值是否不在列表中 6.布爾表達式 7.使用多個列表 1.if語句 前面雖然寫了一點if語句,但只是比較初級的,不太完善 ...

    Python學習筆記_03

    函數 函數的定義 函數 有參數的函數 有返回值的函數 處理異常 類 屬性不用定義 class Point: def move(self): print(“move”) 構造函數 繼承 模塊 module.py app.py 包 包和模塊的區別 創建步驟: 右鍵項目名新建python package 調用包: #python的標準庫概覽 https://www.runoob....

    數據科學03-pandas2-數據可視化

    東陽的學習記錄,堅持就是勝利! 文章目錄 線型圖 從series畫圖 從dataframe畫圖 柱狀圖 直方圖 密度圖 帶密度估計的規格化直方圖 散布圖 餅圖 Series Dataframe 高級繪圖 pandas文檔 Pandas 的數據可視化使用 matplotlib 為基礎組件。更基礎的信息可參閱 matplotlib 相關內容。本節主要介紹 Pandas 里提供的比 matplotlib...

    【大數據筆記03】MapReduce

    框架結構 JavaAPI規范(很少用,一般都是用HiveSQL) (1) 用戶編寫的程序分成三個部分:Mapper,Reducer,Driver(提交運行 mr 程序的客戶端) (2)Mapper 的輸入數據是 KV 對的形式(KV 的類型可自定義) (3)Mapper 的輸出數據是 KV 對的形式(KV 的類型可自定義) (4)Mapper 中的業務邏輯寫在 map()方法中 (5)map()方...

    猜你喜歡

    數據科學04-pandas03-分組計算和索引

    東陽的學習記錄,堅持就是勝利! 文章目錄 分組計算 apply函數 apply 向匿名函數傳遞參數 禁用分組鍵 apply 應用示例:用不同的分組平均值填充空缺數據 applymap 注意這里lamdba的操作單位是元素 注意這里的操作單位是列/行 類別數據 理解categorical Data 連接和合并 詳見 pandas文檔 這里主要介紹apply函數和Categorical Data 分組...

    Opencv入門基礎筆記03

    Opencv入門基礎筆記03:Mat對象的使用 Mat對象我們在學習圖像處理的過程一直在接觸,那么它到底是個什么東西呢? Mat對象的起源: 當OpenCV 1.0發布時候沒有Mat對象,是個C語言風格的數據結構IPlImage來表示內存中圖像對象,但是OpenCV開發者在做復雜圖像處理算法分析與計算時候,創建了很多IplImage這樣的數據結構,偶爾最后可能忘記釋放內存了,這樣算法就有了內存泄漏...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    精品国产乱码久久久久久蜜桃不卡