zoukankan      html  css  js  c++  java
  • Pandas使用技巧

    删除DataFrame指定列有空值的行

      1. mydf.dropna(subset=['col1', 'col2'], inplace = True)
    
      2. mydf = pd.DataFrame({
                            'name' : ['Tom','Amy','John','George'],
                            'sex' : ['male','female',np.nan,'male'],
                            'number' : ['SA1001','SA1002','SA1003','SA1004'],
                            'grade' : [11, 22, 33, 44]
                        })
         mydf['sex'].isnull().value_counts()
         mydf['sex'] = mydf['sex'].fillna('999')
         pos = mydf[mydf.sex=='999'].index.tolist()
         mydf = mydf.drop(pos) # mydf.drop(pos, inplace = True)
    

    找出DataFrame中空元素所在行

      df[df.isnull().T.any()]`
    

    非转置:frame3.isnull().any(),得到的每一列求any()计算的结果,输出为列的Series。

    删除DataFrame中某一列

    1. del mydf['colume_name'] 直接修改原来的数据
    2. mydf.drop('colume_name', axie = 1, inplace = True)
    

    删除多列可以经由以下方式扩展:

    1. col = ['column1', 'column2']   # 指定多个列名
       mydf.drop(labels = col, axis = 1, inplace = True)
    2. mydf.drop(mydef.columns[[2,4]], axie = 1, inplace = True) # 指定多个列索引
    

    DataFrame合并

    merge

    pd.merge(df_left, df_right, how = 'left/right', on = 'column_name')`:函数实现列的合并,on指向的列名必须在两个df表中都存在。

        df1 = pd.DataFrame({'name':['Tom','Amy','John','George'],
                            'sex':['male','female',np.nan,'male'],
                            'number':['SA1001','SA1002','SA1003','SA1004']})
        df2 = pd.DataFrame({'name':['Tom','Amy','John','George'],
                            'age':[18,22,25,20],
                            'grade':[77, 88, 99, 86]})
        df3 = pd.DataFrame({'name':['Tom','Amy','Jack','George'],
                            'age':[18,22,25,20],
                            'grade':[77, 88, 90, 86]})
        print(pd.merge(df1, df2, how='left', on='name'))
        # Jack 那一行被遗弃,而df1的John在df3不存在因此age和grade是NaN
        print(pd.merge(df1, df3, how='left', on='name'))  
        # John 那一行被遗弃,而df1的Jack在df3不存在因此sex和number是NaN
        print(pd.merge(df1, df3, how='right', on='name'))
    

    concat

    pd.concat([df1, df2], axis = 1),按列拼接则需要行数一致。
    pd.concat([df1, df2], axis = 0, ignore_index = True), 按行拼接会使得不重名的列为NaN,ignore_index设为True使得新添df2元素的序号沿着df1本来的末尾序号递增.

    append

    df1.append(df2, ignore_index = True),横向添加新行

    如果添加的列名不在dataframe对象中,将会被当作新的列进行添加。
    因此和 pd.concat([df1, df2],axis = 0)效果一样。

    DataFrame类型转换成numpy.array类型

      1. df.values --> 可以存在字符串
      2. df.as_matrix() --> 高版本已过时
      3. np.array(df)
    

    DataFrame求某些列最小值、最大值、均值

      1. df[['col1', 'col2', 'col3']].min()、 df[['col1', 'col2', 'col3']].max()、 df[['col1', 'col2', 'col3']].mean()
      2. numpy.min(df[['col1', 'col2', 'col3']])
    

    归一化函数

      max_min_scaler = lambda x : (x-np.min(x))/(np.max(x)-np.min(x))
      print(df.iloc[:,2:].apply(max_min_scaler))
      print(df[['chinese_grade','math_grade','english_grade']].apply(max_min_scaler)) #方法2
    

    调整列顺序

    df = pd.DataFrame({'name':['Tom','Amy','John','George'],
                    'age':[18,22,25,20],
                    'chinese_grade':[77, 88, 99, 86],
                    'math_grade':[75,98,88,66],
                    'english_grade':[67,70,59,78]})
    df = df[['age', 'name', 'chinese_grade', 'math_grade', 'english_grade']]
    

    修改index的值 : 与已存在dataframe目前长度必须匹配

    df.index = range(4,0,-1) 
    df.index = [4,3,2,1]
    df.index = ['a', 'b', 'c', 'd'] # 可设为字符串
    df.index = range(0, len(df))
    df.index = range(1, len(df) + 1)
    df.index = range(len(df), 0, -1)
    df = df.reset_index(drop=True)  # drop=True表示删除原索引,不然会在数据表格中新生成一列'index'数据
    df2 = df.set_index(keys=['name','age']) # 将原数据name, age列的数据作为索引
    

    提取df含有指定字符串的行

    行提取

    mask = [False, True, False, True]
    df_mask = df[mask]
    print(df_mask)
    

    完全匹配

    print(df['name'] == 'Amy')
    print(df[df['name'] == 'Amy'])
    

    部分匹配

    case=True不区分大小写,na=True遇到NaN也认为搜到了目标

    print(df['name'].str.contains('o', case=False, na=False))
    print(df[df['name'].str.contains('o')])
    

    以特定字符串开头

    df['name'].str.startswich('A')
    

    以特定字符串结尾

    df['name'].str.endswich('e')
    

    正则表达式模式匹配

    df['name'].str.match(pattern)
  • 相关阅读:
    sql评估已过期
    解决电脑弹窗
    清除电脑缓存,解决电脑卡
    vant小程序实现表单提交(时间组件,弹出层组件)
    jquery每两秒执行函数
    git pull遇到错误:error: Your local changes to the following files would be overwritten by merge:
    阿里云服务器http转https
    微信小程序错误码40029
    1366:Incorrect string value: 'xE4xBBx8AxE5xA4xA9' for column 'content' at row 1 [ SQL语句 ] :
    每日一题 为了工作 2020 0308 第六题
  • 原文地址:https://www.cnblogs.com/Higgerw/p/14087574.html
Copyright © 2011-2022 走看看