zoukankan      html  css  js  c++  java
  • pandas中DataFrame相关

    1.创建

    1.1  标准格式创建

     DataFrame创建方法有很多,常用基本格式是:DataFrame 构造器参数:DataFrame(data=[],index=[],coloumns=[])

    In [272]: df2=DataFrame(np.arange(16).reshape((4,4)),index=['a','b','c','d'],columns=['one','two','three','four'])  
      
    In [273]: df2  
    Out[273]:   
       one  two  three  four  
    a    0    1      2     3  
    b    4    5      6     7  
    c    8    9     10    11  
    d   12   13     14    15  

    1.2 用传入等长列表组成的字典来创建

    In [204]: data={'c':['1','2'],'a':['5']}  #创建不等长字典序列  
      
    In [205]: data  
    Out[205]: {'a': ['5'], 'c': ['1', '2']}  
      
    In [206]: df=DataFrame(data)  
    Traceback (most recent call last):  
    ...  
      
    ValueError: arrays must all be same length   # 报错,传入的数组必须等长  
      
    In [207]: data={'c':['1','2'],'a':['5','6']}  #创建<strong>等长字典序列  
    In [208]: df=DataFrame(data)  
      
    In [209]: df  
    Out[209]:   
       a  c                      # 创建完成后'a','c'自动按照字典序排序,并且创建时自定加上索引  
    0  5  1  
    1  6  2  

    创建完成后'a','c'自动按照字典序排序,并且创建时自定加上索引

    In [210]: df=DataFrame(data,columns=['c','a'])  
      
    In [211]: df  
    Out[211]:   
       c  a    #按照指定顺序创建。  
    0  1  5  
    1  2  6  

    1.3 传入嵌套字典(字典的值也是字典)创建DataFrame

    如果指定了columns名称,则会按照指定顺序创建。

    In [227]: nest_dict={'shanghai':{2015:100,2016:101},'beijing':{2015:102,2016:103}}  
      
    In [228]: nest_dict  
    Out[228]: {'beijing': {2015: 102, 2016: 103}, 'shanghai': {2015: 100, 2016: 101}}  
      
    In [229]: df1=DataFrame(nest_dict)  
      
    In [230]: df1  
    Out[230]:   
          beijing  shanghai  
    2015      102       100  
    2016      103       101  

    2.增删改查

    2.1 增

    创建新列

    df['b']=1  
    l = [1,2,3]
    df['c']=l

    添加新行

    将列表中的数据添加到dataframe中

    df = pd.DataFrame(columns=[u'设备号', u'节目', u'类型', u'完整度', u'调整系数', u'喜爱度'])
    new = pd.DataFrame([info], columns=[u'设备号', u'节目', u'类型', u'完整度', u'调整系数', u'喜爱度'])
    # 忽略索引,往dataframe中插入一行数据
    df = df.append(new, ignore_index=True)

    将数据字典添加到dataframe中

    df = pd.DataFrame(columns=[u'设备号', u'节目', u'类型', u'完整度', u'调整系数', u'喜爱度'])
    new = pd.DataFrame(dict, ,index=["0"])
    # 忽略索引,往dataframe中插入一行数据
    df = df.append(new, ignore_index=True)

    数据合并与重塑

    https://blog.csdn.net/stevenkwong/article/details/52528616

    2.2 删

    用del删除

    In [225]: del df['a']  
      
    In [226]: df  
    Out[226]:   
       c  b  
    0  1  1  
    1  2  1  
    用drop() 删除
    用drop删除时,删的是视图,并没有真正删除
    In [258]: df  
    Out[258]:   
       c  b  0  
    0  5  1  6  
    1  5  1  6  
    In [259]: df.drop(0,axis=1) #删除列Out[259]:     
       c  b  
    0  5  1  
    1  5  1  
    In [260]: df  # df的数据并没有改动  
    Out[260]:     
       c  b  0  
    0  5  1  6  
    1  5  1  6  

    dorp()可以通过axis(行:axis=0 ,列:axis=1)可以控制删除行或列,默认是行。

    dorp()也可以同时删除多行或多列

    In [271]: df.drop([0,1],axis=1)  
    Out[271]:   
       c  b  
    0  6  6  
    1  5  1  

    2.3 改

    通过赋值进行修改,可以通过定位到行,列,或者具体位置进行赋值修改。
    修改具体元素值:
    In [242]: df['c'][1]=4  
      
    In [243]: df  
    Out[243]:   
       c  b  
    0  1  1  
    1  4  1  

    修改列:

    In [244]: df['c']=5   
      
    In [245]: df  
    Out[245]:   
       c  b  
    0  5  1  
    1  5  1  

    修改行:

    df[:1]=6  
      
    df  
    Out[266]:   
       c  b  
    0  6  6  
    1  5  1  

    修改行和列如果传入一组值得话,注意传入数组的长度,如果传入数组长度大于len(df) 则截断,小于df长度则置NaN

    In [267]: df[0]=Series([1,2,3])  
      
    In [268]: df  
    Out[268]:   
       c  b  0  
    0  6  6  1  
    1  5  1  2  
      
    In [269]: df[1]=Series([1,])  #增加一列,传入一个值  
      
    In [270]: df  
    Out[270]:   
       c  b  0   1  
    0  6  6  1   1  
    1  5  1  2 NaN  

    2.4 查

    df[0:1] 选取第一行 按位置选取的 df[0] 这样是错误的的 
    df[‘a’] 选取第a列 按列名选取

    df.loc[0] 按index选取行 df.loc[0:3]选取0,1,2行 df.loc[‘A’] 选取索引为A的行 
    df.loc[[‘A’],’a’] 行列一起选

    df.iloc[0,2] 只能通过位置来选择,选择第一行第三列 
    df.iloc[0:3,1:3]通过位置切片来选择 可以选多的,也可以选中一个元素

    df.at[1,’a’]通过名称来选择,只能选中一个 
    df.iat[1,2]通过位置来选择 只能选中一个

    df.ix[1] 通过位置来选取行 df.ix[‘A’]通过索引选择行 
    df.ix[1,’a’] 同时选取行列,位置和索引都可以 可选中一个元素,也可以是多个

    df选择后的数据基本都是dataframe结构,不能直接使用 
    使用df.values可以获取它的值

    df.columns 输出列的信息

    df.index 输出索引相关信息

    df.describe() 会显示每一列的总数均值等 

    df.info() 显示基本的数据信息 
    df.count() df.mean() df.max() df.min() 统计每一列的统计量 
    df.head(10) 输出前10行 df.tail(10) 输出最后10行

    df.isnull.sum() 按列统计表中的空值的数量 
    df.where(df>10).count() 按列统计 表中大于10的元素个数 
    df.groupby(‘y’).count() 根据y属性进行分组,统计每一组的分布情况

    df['x'].value_counts() #统计某一列x中各个值出现的次数:

    df[df[‘price’]<’7.2’] 把符合条件的行显示出来 
    df.where(df[‘price’]<’7.2’) 所有行都显示,不符合条件的price显示为nan

    3.操作相关

    3.1 去除重复值

    # 重复数据只取第一个值
    df = df.drop_duplicates(subset=[u'企业ID'], keep='first')

    3.2 转换数据类型

    3.2.1 一列转换成str

    # 将int转换成str
    l = list(df[u'企业ID'].apply(str)

    3.2.2 列表转换成字符串

    enterprise_str = ''.join(enterprise_list)

    3.3 连接操作

    3.3.1 多列相加

    data = df['A']+df['B']

    3.3.2 索引左连接

    # 将三个df以企业id为索引拼接起来
    df = df.join(df2)
    df = df.join(df3)

    3.3.3 左连接

    被连接的表的列必须是索引列

    df1.join(df2.set_index('key'), how='left', lsuffix='_df1', rsuffix='_df2', on='keys')

    一个更便捷的实现方法,不需要设置索引

    df = pd.merge(df1, df2, on='action_type', how='left')

    3.3.4 拼接

    # 合并
    df = pd.concat([data1, data2], ignore_index=True)

    3.4 索引相关

    3.4.1 设置索引

    df = df.set_index('ID')

    3.4.2 取消索引

    df = df.reset_index()

    3.5 条件替换

    # 将小于0的值替换为0
    df.loc[df['A']<0, 'A'] = 0

    3.6 改变列顺序

    df = df[['B','A','C']]

    3.7 按某列排序

    # 默认是升序
    df_sort = df.sort_values(by='score', ascending=False)

    3.8 写入excel

    # 存入excel乱码时使用utf_8_sig
    writer = pd.ExcelWriter('result.xlsx')
    df1.to_excel(writer, 'sheetA', index=True, encoding="utf_8_sig")
    df2.to_excel(writer, 'sheetB', index=True, encoding="utf_8_sig")
  • 相关阅读:
    mysql远程执行sql脚本
    数据库死锁
    sqlserver 数据库之调优
    sqlserver 数据库之性能优化
    Session共享的解决办法
    关于对session机制的理解--通俗易懂
    kafka之常用命令
    分布式消息队列之kafka
    vuejs调试代码
    json
  • 原文地址:https://www.cnblogs.com/lzhc/p/9196839.html
Copyright © 2011-2022 走看看