• Python之pandas用法


    Python之pandas用法

    导入

    import pandas as pd
    

    Series

    用pandas的Series函数从数组或列表中创建一个可自定义下标(index)并自动维护标号索引的一维数组

    a = pd.Series([0.25, 0.5, 0.75, 1.0])
    print(a)
    b = pd.Series([0.25, 0.5, 0.75, 1.0], index=['a', 'b', 'c', 'd']) # 自定义下标
    print(b)
    c = pd.Series({'a': 0.25, 'b': 0.5, 'c': 0.75, 'd': 1.0}) # 从dict创建
    print(c)
    '''
    输出
    0    0.25
    1    0.50
    2    0.75
    3    1.00
    dtype: float64
    a    0.25
    b    0.50
    c    0.75
    d    1.00
    dtype: float64
    a    0.25
    b    0.50
    c    0.75
    d    1.00
    dtype: float64
    '''
    

    其中index和values都是可迭代的对象,并且可以像dict那样进行下标访问

    print(a.values)
    print(b.index)
    print(c['b'])
    '''
    输出
    [0.25 0.5  0.75 1.  ]
    Index(['a', 'b', 'c', 'd'], dtype='object')
    0.5
    '''
    

    这里有一些小trick

    print(b[b > 0.7] * 2)
    print(c.sort_values) # 按value排序
    print(b[1:3]) # 切片的下标对应的是自动维护的标号索引
    '''
    输出
    c    1.5
    d    2.0
    dtype: float64
    <bound method Series.sort_values of a    0.25
    b    0.50
    c    0.75
    d    1.00
    dtype: float64>
    b    0.50
    c    0.75
    dtype: float64
    '''
    

    用loc和iloc分别表示访问自定义索引和自动维护的标号索引

    data = pd.Series(['a', 'b', 'c'], index=[1, 3, 5])
    print(data.loc[1])
    print(data.iloc[1])
    ''' 
    输出
    a
    b
    '''
    

    Series可以更新索引,如果一个旧索引在新索引中没有出现过,则会被除去;若一个新索引在旧索引中没有出现,就会显示NaN(not a number),表示缺失。

    sdata = {'a': 1, 'b': 3, 'c': 5, 'd': 7}
    obj1 = pd.Series(sdata)
    print(obj1)
    states = ['b', 'c', 'd', 'e']
    obj2 = pd.Series(sdata, index=states)
    print(obj2)
    '''
    输出
    a    1
    b    3
    c    5
    d    7
    dtype: int64
    b    3.0
    c    5.0
    d    7.0
    e    NaN
    dtype: float64
    '''
    

    Series还会根据运算的索引标签自动对齐数据

    print(obj1 + obj2)
    '''
    输出
    a     NaN
    b     6.0
    c    10.0
    d    14.0
    e     NaN
    dtype: float64
    '''
    

    DataFrame

    用多个Series的组合生成DataFrame

    tag1_dict = {'a': 1, 'b': 2, 'c': 3}
    tag1 = pd.Series(tag1_dict)
    tag2_dict = {'b': 11, 'c': 12, 'd': 13}
    tag2 = pd.Series(tag2_dict)
    df = pd.DataFrame({'tag1': tag1, 'tag2': tag2})
    print(df)
    '''
    输出
       tag1  tag2
    a   1.0   NaN
    b   2.0  11.0
    c   3.0  12.0
    d   NaN  13.0
    '''
    

    用词典的列表生成DataFrame

    data = [{'a': i, 'b': i * 2} for i in range(3)]
    print(pd.DataFrame(data))
    '''
    输出
       a  b
    0  0  0
    1  1  2
    2  2  4
    '''
    

    用一个numpy的二维数组生成DataFrame,并自定义行和列索引

    print(pd.DataFrame(np.random.rand(3, 2), columns=['a', 'b'], index=['c', 'd', 'e']))
    '''
    输出
              a         b
    c  0.341337  0.379886
    d  0.968444  0.595278
    e  0.207694  0.440617
    '''
    

    获取一列

    print(df.tag1)
    print(df['tag1'])
    '''
    输出
    a    1.0
    b    2.0
    c    3.0
    d    NaN
    Name: tag1, dtype: float64
    a    1.0
    b    2.0
    c    3.0
    d    NaN
    Name: tag1, dtype: float64
    '''
    

    直接新添加一列

    df['tag3'] = df['tag1'] + df['tag2']
    print(df)
    '''
    输出
       tag1  tag2  tag3
    a   1.0   NaN   NaN
    b   2.0  11.0  13.0
    c   3.0  12.0  15.0
    d   NaN  13.0   NaN
    '''
    

    行列互换

    s = df.T
    print(s)
    '''
    输出
            a     b     c     d
    tag1  1.0   2.0   3.0   NaN
    tag2  NaN  11.0  12.0  13.0
    tag3  NaN  13.0  15.0   NaN
    '''
    

    筛选

    print(df.loc[df.tag2 > 11, ['tag1', 'tag2']])
    '''
    输出
       tag1  tag2
    c   3.0  12.0
    d   NaN  13.0
    '''
    

    赋值

    df.iloc[1, 1] = 100
    print(df)
    '''
    输出
       tag1   tag2  tag3
    a   1.0    NaN   NaN
    b   2.0  100.0  13.0
    c   3.0   12.0  15.0
    d   NaN   13.0   NaN
    '''
    

    可以在numpy的函数中直接传入一个DataFrame,相当于把函数作用于其中的所有值

    df = pd.DataFrame(np.random.randint(0, 10, (2, 3)), columns=['a', 'b', 'c'])
    print(np.sin(df * np.pi / 4))
    '''
    输出
         a         b         c
    0 -1.0  0.707107 -1.000000
    1 -1.0  0.707107 -0.707107
    '''
    

    DataFrame之间的运算自动进行索引对其和补足

    df1 = pd.DataFrame(np.random.randint(0, 3, (2, 2)), columns=['a', 'b'])
    df2 = pd.DataFrame(np.random.randint(0, 3, (2, 2)), columns=['b', 'c'])
    print(df1 + df2)
    print(df1.add(df2, fill_value=100))
    '''
    输出
        a  b   c
    0 NaN  3 NaN
    1 NaN  2 NaN
           a  b      c
    0  100.0  3  102.0
    1  101.0  2  101.0
    '''
    

    DataFrame与Series进行计算,相当于按行或按列广播

    df = pd.DataFrame(np.random.randint(0, 10, (2, 2)), columns=['a', 'b'])
    print(df)
    print(df - df.iloc[1])
    '''
    输出
       a  b
    0  3  8
    1  4  5
       a  b
    0 -1  3
    1  0  0
    '''
    

    各种函数

    isnull()和notnull()

    作用:查找和判断NaN

    fillna()

    作用:替换NaN

    dropna()

    作用:删除NaN所在的行或列

    concat()和merge()

    作用:合并DataFrame

    stack()和unstack()

    作用:对索引堆叠或展开

    groupby()

    作用:对DataFrame重新分组

  • 相关阅读:
    JDK1.8十个新特性
    问题:No more handles [Could not detect registered XULRunner to use]
    在未标记为正在运行时,调用了RunScript
    问题: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
    常用数据库的JDBC 的URL形式
    Myeclipse插件的三种安装方式
    mysqlError: Illegal connection port value '3306>]'
    异常:Bad version number in .class file
    安装msi文件遇到错误code=2502 or 2503 win8
    spring使用RedisTemplate的坑Could not get a resource from the pool
  • 原文地址:https://www.cnblogs.com/beginend/p/11741433.html
Copyright © 2020-2023  润新知