• python pandas 数据处理


     内容汇总目录:

    df插入一行

    相同列名df合并

    df去极值

    df行、列分别求和

    https://blog.csdn.net/zhili8866/article/details/68134481

    1、修改一个或多个列名

    2、增加列、插入列、删除列或行

    3、删除特定行或特定列,可以按照索引(行名)、列名、元素值来筛选

    4、df两行之间运算

    5、判断元素是否在Series中

    将字符串类型日期修改为datetime日期类型

    将df或者Series等分

    1、df数据选取

    2、set_index、reset_index、sort_index、reindex、sort_values

    3、暴力修改索引

    计算累积收益率

    df中eval用法

    df中数据格式转换

    pandas.DataFrame.iterrows

    pandas.Series.searchsorted

    df插入一行

    分两种情况,一、插入行没有索引;二、插入的行有索引,用reindex重新设置索引

    df = pd.DataFrame(np.arange(12).reshape(3, 4), columns=list('abcd'))
    df
    Out[9]: 
       a  b   c   d
    0  0  1   2   3
    1  4  5   6   7
    2  8  9  10  11
    df.loc[-1]=[1,1,1,1]
    df
    Out[12]: 
        a  b   c   d
     0  0  1   2   3
     1  4  5   6   7
     2  8  9  10  11
    -1  1  1   1   1
    df.loc[df.shape[0]+1]=[1,1,1,1]
    df
    Out[14]: 
        a  b   c   d
     0  0  1   2   3
     1  4  5   6   7
     2  8  9  10  11
    -1  1  1   1   1
     5  1  1   1   1
    df.index=['aa','bb','cb','dd','ee']
    df
    Out[24]:
        a  b   c   d
    aa  0  1   2   3
    bb  4  5   6   7
    cb  8  9  10  11
    dd  1  1   1   1
    ee  1  1   1   1

    相同列名df合并

    df.append(df)
    Out[22]: 
       a  b   c   d         e
    0  0  1   2   3 -1.564839
    1  4  5   6   7 -0.268072
    2  8  9  10  11  0.229017
    0  0  1   2   3 -1.564839
    1  4  5   6   7 -0.268072
    2  8  9  10  11  0.229017

    功能:df去极值

    df = pd.DataFrame(np.arange(12).reshape(3, 4), columns=list('abcd'))
    df.where(df<df.median(),df.median(),axis=1)
    Out[73]: 
       a  b  c  d
    0  0  1  2  3
    1  4  5  6  7
    2  4  5  6  7

    功能:df行、列分别求和

    #DataFrame行、列分别求和
    from pandas import Series, DataFrame 
    import pandas as pd
    import numpy as np
    df = pd.DataFrame(np.arange(12).reshape(3, 4), columns=list('abcd')) df Out[31]: a b c d 0 0 1 2 3 1 4 5 6 7 2 8 9 10 11 df['col_sum']=df.sum(axis=1) df Out[34]: a b c d col_sum 0 0 1 2 3 6 1 4 5 6 7 22 2 8 9 10 11 38 df.ix['row_sum']=df.sum() df Out[36]: a b c d col_sum 0 0 1 2 3 6 1 4 5 6 7 22 2 8 9 10 11 38 row_sum 12 15 18 21 66

     

    功能:

    1、修改一个或多个列名

    2、增加列、插入列、删除列或行

    3、删除特定行或特定列,可以按照索引(行名)、列名、元素值来筛选

    4、df两行之间运算

    5、判断元素是否在Series中

    df = pd.DataFrame(np.arange(1, 17).reshape(4, 4), index=pd.date_range('2017/1/1', periods=4), columns=list('mnxy'))
    df
    Out[39]: 
                         m   n   x   y
    2017-01-01   1   2   3   4
    2017-01-02   5   6   7   8
    2017-01-03   9  10  11  12
    2017-01-04  13  14  15  16
    # 修改特定(某一列或某几列)列名
    df.rename(columns={'m': 'n', 'n': 'm'}, inplace=True)
    df
    Out[41]: 
                         n   m   x   y
    2017-01-01   1   2   3   4
    2017-01-02   5   6   7   8
    2017-01-03   9  10  11  12
    2017-01-04  13  14  15  16
    # 增加列
    df['mn']=1
    df
    Out[44]: 
                         n   m   x   y  mn
    2017-01-01   1   2   3   4   1
    2017-01-02   5   6   7   8   1
    2017-01-03   9  10  11  12   1
    2017-01-04  13  14  15  16   1
    # 插入列
    df.insert(1, 'e', 1000)  # 1为插入位置,1000为插入内容
    df
    Out[46]: 
                          n     e   m   x   y  mn
    2017-01-01   1  1000   2   3   4   1
    2017-01-02   5  1000   6   7   8   1
    2017-01-03   9  1000  10  11  12   1
    2017-01-04  13  1000  14  15  16   1
    # 删除列
    del df['mn']
    df
    Out[48]: 
                          n     e   m   x   y
    2017-01-01   1  1000   2   3   4
    2017-01-02   5  1000   6   7   8
    2017-01-03   9  1000  10  11  12
    2017-01-04  13  1000  14  15  16
    
    # drop删除列,inplcae=False,不改变原数据,返回dataframe存放删除后的数据
    # inplace=True,改变原数据,返回None
    # drop比del好,del只能删除列,drop行和列都可以
    df1 = df.drop(['m', 'n'], axis=1)
    df
    Out[50]: 
                          n     e   m   x   y
    2017-01-01   1  1000   2   3   4
    2017-01-02   5  1000   6   7   8
    2017-01-03   9  1000  10  11  12
    2017-01-04  13  1000  14  15  16
    df1
    Out[51]: 
                               e   x   y
    2017-01-01  1000   3   4
    2017-01-02  1000   7   8
    2017-01-03  1000  11  12
    2017-01-04  1000  15  16
    df2 = df.drop(['m', 'n'], axis=1, inplace=True)
    df
    Out[53]: 
                             e   x   y
    2017-01-01  1000   3   4
    2017-01-02  1000   7   8
    2017-01-03  1000  11  12
    2017-01-04  1000  15  16
    df2  #
    
    # drop删除行,与上面用法类似
    df.index=['a','b','c','d']
    df
    Out[58]: 
          e   x   y
    a  1000   3   4
    b  1000   7   8
    c  1000  11  12
    d  1000  15  16
    df.drop(['a'],inplace=True)
    df
    Out[60]: 
          e   x   y
    b  1000   7   8
    c  1000  11  12
    d  1000  15  16
    
    # 获取特定的几行
    df = df.ix[['b','c']]
    # 删除特定行,删除与选取类似 # 1、例如删除x列中为7的行 df = df[df['x'] != 7] df Out[65]: e x y c 1000 11 12 d 1000 15 16 # 2、删除多个非特定元素的行,如删除m列中为6和9的行 # 方法一:多删除几次即可
    # 方法二:

    #‘B’列中值为'one','two'的df
    #df[df['B'].isin(['one','two'])]
    #‘B’列中值不为‘one','two'的df
    #df[~df['B'].isin(['one','two'])]
    #索引中为’a‘,’b‘的df
    #df[df.index.isin(['a','b')]
    #索引中不为'b','b'的df
    #df[~df.index.isin(['a','b'])]
    # 删除特定列,例如索引为c的行中为某值(比如11)的列,即删去‘x’列 # 可以先转置,按照上面方法删除,再转置回来即可 # DataFrame两行相减 df.ix['f'] = df.ix['c'] - df.ix['d'] #这个以后要被Deprecated,用loc df Out[69]: e x y c 1000 11 12 d 1000 15 16 f 0 -4 -4 df.loc['g'] = df.loc['c'] - df.loc['d'] # 多用loc和iloc,用这两个就够了!!!! df Out[71]: e x y c 1000 11 12 d 1000 15 16 f 0 -4 -4 g 0 -4 -4 # 删除掉Series中小于3的数据 new_data = df['e'][df['e'] >= 3] new_data Out[73]: c 1000 d 1000 Name: e, dtype: int64 # 删除掉dataframe中小于0的数据 new_data = df[df >= 0] # 将小于0的数据替换为NaN,可用dorpna()彻底删除 new_data Out[75]: e x y c 1000 11.0 12.0 d 1000 15.0 16.0 f 0 NaN NaN g 0 NaN NaN new_data.dropna(inplace=True) new_data Out[77]: e x y c 1000 11.0 12.0 d 1000 15.0 16.0

     可参考博客    pandas 数据索引与选取

    #接上面代码
    # 判断某一元素是否在Series中
    11 in df['x'].tolist()
    Out[83]: True
    # 判断某一些元素是否在Series中
    df['x'].isin(['a', 'b', 11])  # 判断元素'a','b',11是否在Series中
    Out[85]: 
    c     True
    d    False
    f    False
    g    False
    Name: x, dtype: bool

    功能:将字符串类型日期修改为datetime日期类型

    # 将字符串类型日期修改为datetime日期类型
    #方法1: .to_datetime 和 .set_index
    df=pd.DataFrame({'date':'2018-01-01','price':20},index=list('ab'))
    df
    Out[7]: 
             date  price
    a  2018-01-01     20
    b  2018-01-01     20
    df['date']=pd.to_datetime(df['date'])
    df.set_index('date',inplace=True)
    df
    Out[11]: 
                price
    date             
    2018-01-01     20
    2018-01-01     20
    df.index
    Out[12]: DatetimeIndex(['2018-01-01', '2018-01-01'], dtype='datetime64[ns]', name='date', freq=None)
    
    #方法2:.set_index和 .DatetimeIndex
    df=pd.DataFrame({'date':'2018-01-01','price':20},index=list('ab'))
    df
    Out[14]: 
             date  price
    a  2018-01-01     20
    b  2018-01-01     20
    df.set_index('date',inplace=True)
    df.index=pd.DatetimeIndex(df.index)
    df
    Out[17]: 
                price
    date             
    2018-01-01     20
    2018-01-01     20
    df.index
    Out[18]: DatetimeIndex(['2018-01-01', '2018-01-01'], dtype='datetime64[ns]', name='date', freq=None)

    功能:将df或者Series等分

    # 将dataframe或者series三等分
    # cut区间范围等分,每个范围数据个数不等,qcut分位数等分,每个范围数据个数相等
    # cut和qcut返回的factor对象可直接用于groupby
    frame = pd.DataFrame({'data1': np.random.randn(10), 'data2': np.random.randn(10)})
    frame
    Out[20]: 
          data1     data2
    0 -0.420824  0.517133
    1 -1.085327  0.969493
    2  1.111569 -1.444616
    3 -1.837042  0.934159
    4 -1.290986  0.565812
    5  2.792878  0.756323
    6 -0.925471 -0.193387
    7 -0.035497 -0.795628
    8 -0.737259  0.121162
    9  0.375720 -0.380498
    factor = pd.cut(frame['data1'], 4)  # 也可以改为qcut,桶等分
    for i in frame.groupby(factor):
        print(i)
        
    (Interval(-1.8420000000000001, -0.68000000000000005, closed='right'),       data1     data2
    1 -1.085327  0.969493
    3 -1.837042  0.934159
    4 -1.290986  0.565812
    6 -0.925471 -0.193387
    8 -0.737259  0.121162)
    (Interval(-0.68000000000000005, 0.47799999999999998, closed='right'),       data1     data2
    0 -0.420824  0.517133
    7 -0.035497 -0.795628
    9  0.375720 -0.380498)
    (Interval(0.47799999999999998, 1.635, closed='right'),       data1     data2
    2  1.111569 -1.444616)
    (Interval(1.635, 2.7930000000000001, closed='right'),       data1     data2
    5  2.792878  0.756323)

     功能:df数据选取

    import pandas as pd
    from pandas import Series, DataFrame
    import numpy as np
    
    # SettingWithCopyWarning:
    # A value is trying to be set on a copy of a slice from a DataFrame.
    # Try using .loc[row_indexer,col_indexer] = value instead
    # See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
    
    # 是选数据的时候方法问题,用的
    df = pd.DataFrame(np.arange(12).reshape(3, 4), columns=list('abcd'))
    a = df[['x', 'y']]        # 错误用法
    a = df.loc[:, ['x', 'y']] #正确用法
    
    def do_something(df):
        foo = df[['bar', 'baz']]  # Is foo a view? A copy? Nobody knows!
        # ... many lines here ...
        foo['quux'] = 'value'  # We don't know whether this will modify df or not!
        return foo
    df = pd.DataFrame(np.arange(12).reshape(3, 4), index=list('xyz'), columns=['A', 'B', 'C', 'D'])
    df
    Out[134]: 
       A  B   C   D
    x  0  1   2   3
    y  4  5   6   7
    z  8  9  10  11
    # 列-->>索引 set_index() #原来的索引被删掉,即x、y、z被删掉
    df = df.set_index(['A'])
    df
    Out[136]: 
       B   C   D
    A           
    0  1   2   3
    4  5   6   7
    8  9  10  11
    df = df.set_index('B')
    print(df)
        C   D
    B        
    1   2   3
    5   6   7
    9  10  11
    # 索引-->>列 reset_index   #注意,如果要丢掉原来索引,重新排列,可以pd.reset_index(drop=True)即可,Series也可以
    df = df.reset_index()
    df
    Out[139]: 
       B   C   D
    0  1   2   3
    1  5   6   7
    2  9  10  11
    df['index'] = df.index
    df
    Out[141]: 
       B   C   D  index
    0  1   2   3      0
    1  5   6   7      1
    2  9  10  11      2
    # 索引重排列,方法一
    df.sort_index()
    Out[154]: 
       B   C   D  index
    0  1   2   3      0
    1  5   6   7      1
    2  9  10  11      2
    # 索引重排列,方法二
    df = df.reindex([1, 2, 0])
    df
    Out[143]: 
       B   C   D  index
    1  5   6   7      1
    2  9  10  11      2
    0  1   2   3      0
    # 暴力修改索引,用的较少,但是没有索引名字了
    df.index = ['x', 'y', 'z']
    df
    Out[145]: 
       B   C   D  index
    x  5   6   7      1
    y  9  10  11      2
    z  1   2   3      0
    # 按照列的值排序
    df.sort_values(by='B')
    Out[147]: 
       B   C   D  index
    z  1   2   3      0
    x  5   6   7      1
    y  9  10  11      2

    功能:计算累积收益率

    # 计算累计收益率,假设m列中均为股票S价格,结果均为series
    df = pd.DataFrame(np.arange(1, 17).reshape(4, 4), index=pd.date_range('2017/1/1', periods=4), columns=list('mnxy'))
    df
    Out[163]: 
                 m   n   x   y
    2017-01-01   1   2   3   4
    2017-01-02   5   6   7   8
    2017-01-03   9  10  11  12
    2017-01-04  13  14  15  16
    series_data = df['m']
    returns = series_data.pct_change()
    ret_index = (1 + returns).cumprod()
    ret_index[0] = 1
    ret_index
    Out[165]: 
    2017-01-01     1.0
    2017-01-02     5.0
    2017-01-03     9.0
    2017-01-04    13.0
    Freq: D, Name: m, dtype: float64

    功能:df中eval用法

    #DataFrame 中 eval用法
    df = pd.DataFrame(np.arange(15).reshape(5, 3), index=pd.date_range('2017/1/1', periods=5), columns=list('mnx')) df Out[119]: m n x 2017-01-01 0 1 2 2017-01-02 3 4 5 2017-01-03 6 7 8 2017-01-04 9 10 11 2017-01-05 12 13 14 df.eval('n=m/2') Out[120]: m n x 2017-01-01 0 0.0 2 2017-01-02 3 1.5 5 2017-01-03 6 3.0 8 2017-01-04 9 4.5 11 2017-01-05 12 6.0 14 df.eval('y=m+n+x') Out[121]: m n x y 2017-01-01 0 1 2 3 2017-01-02 3 4 5 12 2017-01-03 6 7 8 21 2017-01-04 9 10 11 30 2017-01-05 12 13 14 39

     功能:df中数据格式转换

    #DataFrame中数据格式转换
    df= pd.DataFrame({'data1': np.random.randn(10), 'data2': np.random.randn(10)})
    df
    Out[158]: 
          data1     data2
    0  0.502123 -0.509918
    1 -0.951938  1.087244
    2  0.813539  1.472696
    3 -2.371410  1.653909
    4 -2.003656 -0.377436
    5 -0.568296  0.860488
    6 -0.298069  0.524529
    7  1.495561 -0.168975
    8  0.071808 -0.657124
    9  1.033833 -0.792216
    #保留两位小数
    df.round(2)  #注意:df本没有变化,如果要直接修改,应是:df=df.round(2)
    Out[159]: 
       data1  data2
    0   0.50  -0.51
    1  -0.95   1.09
    2   0.81   1.47
    3  -2.37   1.65
    4  -2.00  -0.38
    5  -0.57   0.86
    6  -0.30   0.52
    7   1.50  -0.17
    8   0.07  -0.66
    9   1.03  -0.79
    #浮点型转换为字符串,也可以一列一列修改,下同
    df.astype('str')
    Out[160]: 
                     data1                 data2
    0   0.5021230983459903   -0.5099175252419896
    1  -0.9519381099105976     1.087243798112059
    2   0.8135390670890555    1.4726958935479506
    3   -2.371409829647876    1.6539092429632931
    4  -2.0036555631578294  -0.37743579303176955
    5  -0.5682959379210526    0.8604878115460606
    6  -0.2980691412731598    0.5245286812900314
    7   1.4955614539023945  -0.16897501597784825
    8  0.07180772648583414   -0.6571243077010698
    9    1.033833479234571   -0.7922160997192839
    #字符串转换为整数
    df.astype('int')
    Out[161]: 
       data1  data2
    0      0      0
    1      0      1
    2      0      1
    3     -2      1
    4     -2      0
    5      0      0
    6      0      0
    7      1      0
    8      0      0
    9      1      0

    1、pandas.DataFrame.iterrows

    2、pandas.Series.searchsorted

    import numpy as np
    x=pd.DataFrame(np.arange(16).reshape(4,4),index=list('numb'),columns=list('xyzi'))
    x
    Out[12]: 
        x   y   z   i
    n   0   1   2   3
    u   4   5   6   7
    m   8   9  10  11
    b  12  13  14  15
    y=x.iterrows()
    y
    Out[14]: <generator object DataFrame.iterrows at 0x000001F88B224D58>
    for i in y:
        print(i)
        
    ('n', x    0
    y    1
    z    2
    i    3
    Name: n, dtype: int32)
    ('u', x    4
    y    5
    z    6
    i    7
    Name: u, dtype: int32)
    ('m', x     8
    y     9
    z    10
    i    11
    Name: m, dtype: int32)
    ('b', x    12
    y    13
    z    14
    i    15
    Name: b, dtype: int32)
    x.index
    Out[16]: Index(['n', 'u', 'm', 'b'], dtype='object')
    x.index.searchsorted('u')
    Out[17]: 4
    x.index.searchsorted('a')
    Out[18]: 0
    x.index.searchsorted('z')
    Out[19]: 4
    x.index.searchsorted('b')
    Out[20]: 0
  • 相关阅读:
    解决CentOS(6和7版本),/etc/sysconfig/下没有iptables的问题
    centOS7在VirtualBox中装好后的网络连接问题
    [bzoj1022/poj3480]小约翰的游戏John_博弈论
    [poj2311]Cutting Game_博弈论
    [poj1704]Georgia and Bob_博弈论
    [poj2368]Buttons_博弈论
    NOIP2015 提高组合集
    NOIP2014 提高组合集
    NOIP2013 提高组合集
    NOIP2012 提高组合集
  • 原文地址:https://www.cnblogs.com/bawu/p/7206326.html
Copyright © 2020-2023  润新知