美文网首页
Pandas-筛选数据

Pandas-筛选数据

作者: davidic | 来源:发表于2019-02-13 17:12 被阅读0次

    筛选数据

    转置

    df.T
    

    遍历

    traj_plot.py

    df = df.set_index('gpstime')
    for index, row in df.iterrows():
        locationF.write("p%s | %s | %s | %s | %s " % (str(cnt), index, str(row[0]), str(row[1]), str(row[2])) + '\n' )
    
    import numpy as np
    import pandas as pd
    
    def _map(data, exp):                  
        for index, row in data.iterrows():   # 获取每行的index、row
            for col_name in data.columns:
                row[col_name] = exp(row[col_name]) # 把结果返回给data
        return data
    
    def _1map(data, exp):
        _data = [[exp(row[col_name])               # 把结果转换成2级list
                 for col_name in data.columns]
                 for index, row in data.iterrows()
                ]
        return _data
    
    
    if __name__ == "__main__":
        inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]
        df = pd.DataFrame(inp)
        temp = _map(df, lambda ele: ele+1 )
        print temp
    
        _temp = _1map(df, lambda ele: ele+1)
        res_data = pd.DataFrame(_temp)         # 对2级list转换成DataFrame
        print res_data
    

    排序

    通过列名来排序

    #对于矩阵,axis=0表示行,1表示列
    df.sort_index(axis=1, ascending=False)
    

    通过某一列的数值排序

    df.sort_values(by='B')
    
    import pandas as pd
    
    df = pd.read_csv('./query_result.csv', sep=',')
    # 转为日期型
    df['gpstime'] = pd.to_datetime(df['gpstime'])
    # 按某一列排序
    df.sort_values(['gpstime'])
    

    选择

    series选择某行

    df_app_no[0] #不需要跟列名,因为只有一列
    

    选择某个行列的值

    bad_predict_label.iloc[i, 0]
    

    表示选择第i行,第0列的值

    选择某一列

    df['A']
    

    某几列

    col_n = ['名称','收盘价','日期']
    
    a = pd.DataFrame(df,columns = col_n)
    

    选择某几行

    df[0:3]
    #也可以通过行的索引来选择,但是不能单独写某一行
    df['20130102':'20130104']
    

    通过条件过滤行

    df_pred.label[df_pred['label']<1]
    

    选择几列转为矩阵

    coords=dftest.as_matrix(columns=['longitude','latitude'])
    

    抽样

    df_train_p = df_train_p.sample(frac=0.7)
    

    过滤

    找到为null的

    print(dfall[dfall.isnull().values == True])
    

    pandas如何去掉、过滤数据集中的某些值或者某些行?

    删除某列

    方法一:直接del DF['column-name']
    
    方法二:采用drop方法,有下面三种等价的表达式:
    
    1. DF= DF.drop('column_name', 1);
    2. DF.drop('column_name',axis=1, inplace=True)
    # inplace=true表示对原DF操作,否则将结果生成在一个新的DF中
    3. DF.drop(DF.columns[ : ], axis=1,inplace=True)   # Note: zero indexed
    
    x = [1,2]    #删除多列需给定列表,否则参数过多
    df.drop(df.columns[x],axis=1,inplace=True)
    
    

    pandas删除列

    根据时间范围过滤

    df = df.set_index('gpstime')
    df['2018-04-22 01:00:00': '2018-04-22 05:00:00']
    

    某一列按条件过滤

    
    nightdf = nightdf[nightdf['speed']<1]
    
    df06 = df04.loc[True - (float(df04.columns[-6]) > 0.0)]
    
    # 验证有效的方法
    df_pred_raw.due_type3[(df_pred_raw['due_type3']<12) & (df_pred_raw['due_type3']>5)]
    

    行列同时过滤

    wrong_idx = result[(result['pred']<0.95) & (result['label']>0.05)].index
    df_pred_wrong = df_pred_raw.loc[wrong_idx, ['yq30_term_rate_3','due_type3','zd_term_rate']]
    

    用正则过滤

    df.filter(regex=("d.*"))
    >>
       d1  d2
    0  2   3
    1  3   4
    2  4   5
    
    df.select(lambda col: col.startswith('d'), axis=1)
    >>
       d1  d2
    0  2   3
    1  3   4
    2  4   5
    
    df_trains = df_trains.filter(regex=(".*3days|label|.*7days"))
    

    groupby

    利用pandas进行数据分组及可视化

    pandas聚合和分组运算——GroupBy技术(1)

    例1

    from sklearn.datasets.samples_generator import make_blobs
    from matplotlib import pyplot
    from pandas import DataFrame
    # generate 2d classification dataset
    X, y = make_blobs(n_samples=100, centers=3, n_features=2)
    # dict中定义三个key,分别是坐标和label,再通过dict创建DataFrame
    df = DataFrame(dict(x=X[:,0], y=X[:,1], label=y))
    colors = {0:'red', 1:'blue', 2:'green'}
    fig, ax = pyplot.subplots()
    #groupby可以通过传入需要分组的参数实现对数据的分组
    grouped = df.groupby('label')
    for key, group in grouped:
       group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colors[key])
    pyplot.show()
    

    例2

    import pandas as pd
    import matplotlib.pyplot as plt
    
    # 把数据划分到自定义的区间中
    def cla(n,lim):
        return'[%.f,%.f)'%(lim*(n//lim),lim*(n//lim)+lim) # map function
    
    # 默认第一行是标题,从第二行开始是数据。sep是分隔符
    df = pd.read_csv('/home/david/iaudience-plan-statistics.csv', sep=',')
    # 设置某列的数据类型
    df['precent'] = df['precent'].astype('float64')
    # 对planid做group,group后对precent做sum
    grouped = df['precent'].groupby(df['planid']).sum()
    
    c = pd.DataFrame(grouped)
    # 用c.precent或c['precent']都可以
    addone = pd.Series([cla(s,1) for s in c.precent])
    c['addone'] = addone
    groups3 = c.groupby(['addone']).count()
    groups3['precent'].plot('bar')
    plt.show()
    

    去重

    https://blog.csdn.net/xinxing__8185/article/details/48022401

    from pandas import Series, DataFrame  
      
    data = DataFrame({'k': [1, 1, 2, 2]})  
      
    print data  
      
    IsDuplicated = data.duplicated()  
      
    print IsDuplicated  
    print type(IsDuplicated)  
      
    data = data.drop_duplicates()  
    print data
    

    DataFrame的duplicated方法返回一个布尔型Series,表示各行是否重复行。

    而 drop_duplicates方法,它用于返回一个移除了重复行的DataFrame

    这两个方法会判断全部列,你也可以指定部分列进行重复项判段。

    例如,希望对名字为k2的列进行去重,

    data.drop_duplicates(['k2'])

    相关文章

      网友评论

          本文标题:Pandas-筛选数据

          本文链接:https://www.haomeiwen.com/subject/cnbdeqtx.html