zoukankan      html  css  js  c++  java
  • Pandas 50题练习

    1    
        f行的age改为1.5
        df.loc['f', 'age'] = 1.5
        
        这样比 df.loc['f']['age'] 好
        
        
    2 计算df中每个种类animal的数量
        
        df['animal'].value_counts()
        
        我是 计算df中每个种类animal的数量
        df.groupby('animal').count()
        
        不好
        
    3 将priority列中的yes, no替换为布尔值True, False
        df['priority'] = df['priority'].map({'yes': True, 'no': False})
            
        我的做法
        df['priority'] = df['priority'].str.replace('no','false')
        df['priority'] = df['priority'].str.replace('yes','true')
        
        
    4 对每种animal的每种不同数量visits,计算平均age,即,返回一个表格,行是aniaml种类,列是visits数量,表格值是行动物种类列访客数量的平均年龄
        df.pivot_table(index='animal', columns='visits', values='age', aggfunc='mean')
    
        我的做法    
        res = df.groupby(by=['animal','visits'])['age'].mean() 这样是不行的
        
        
    5  一个全数值DatraFrame,每个数字减去该行的平均数
        df = pd.DataFrame(np.random.random(size=(5, 3)))
        print(df)
        df1 = df.sub(df.mean(axis=1), axis=0)
        print(df1)
    
        我的做法
        for i in range(len(df)):
            for j in (df.columns):
                df.loc[i,j] = df.loc[i,j] - df.loc[i].mean()
                
    6  一个有5列的DataFrame,求哪一列的和最小
        df = pd.DataFrame(np.random.random(size=(5, 5)), columns=list('abcde'))
        print(df)
        df.sum().idxmin()
        
        我的做法    
        df.sum().sort_values()  然后自己肉眼识别
        
        
    7 给定DataFrame,求A列每个值的前3的B的值的和
        df = pd.DataFrame({'A': list('aaabbcaabcccbbc'),
                           'B': [12,345,3,1,45,14,4,52,54,23,235,21,57,3,87]})
        print(df)
        df1 = df.groupby('A')['B'].nlargest(3).sum(level=0)
        print(df1)
        
        
    8 给定DataFrame,有列A, B,A的值在1-100(含),对A列每10步长,求对应的B的和
        df = pd.DataFrame({'A': [1,2,11,11,33,34,35,40,79,99],
                           'B': [1,2,11,11,33,34,35,40,79,99]})
        print(df)
        df1 = df.groupby(pd.cut(df['A'], np.arange(0, 101, 10)))['B'].sum()
        print(df1)
        
        我的做法大体类似,但是稍微繁琐,对pd.groupby 理解不到位。groupby第一个参数也可以接收series或者dict,应用在dataframe的第一列值。
        
        
        s = pd.cut(df['a'],bins=10,labels=['one','two','three','four','five','six','seven','eight','nine','ten'])
        df['label'] = s
        df.groupby('label')['b'].sum()
        
    9 一个全数值的DataFrame,返回最大3个值的坐标
        df = pd.DataFrame(np.random.random(size=(5, 3)))
        print(df)
        df.unstack().sort_values()[-3:].index.tolist()
    
        我的做法是取每个column的最大值,排序后再选最大的三个。很明显,繁琐。
        注意,df必须先unstack后才能 sort_values,要不然会报错。
        
        
    10 
    dti = pd.date_range(start='2015-01-01', end='2015-12-31', freq='B')
    s = pd.Series(np.random.rand(len(dti)), index=dti)
    
    s.head(10)
    所有礼拜三的值求和
    s[s.index.weekday == 2].sum()
    
        还有这种方法?!!
        
        
    11 求每个自然月的平均数
        s.resample('M').mean()  索引为时间序列的重要方法 resample 重采样
    每连续4个月为一组,求最大值所在的日期
    s.groupby(pd.Grouper(freq='4M')).idxmax()
    
    我的做法
    还有个pd.Grouper方法?666 
    
    FlightNumber列中有些值缺失了,他们本来应该是每一行增加10,填充缺失的数值,并且令数据类型为整数
    df['FlightNumber'] = df['FlightNumber'].interpolate().astype(int)
    
    我的做法 
        series,dataframe 都有 interpolate 这个方法,记一下
        
        
    将From_To列从_分开,分成From, To两列,并删除原始列
    temp = df.From_To.str.split('_', expand=True)
    temp.columns = ['From', 'To']
    df = df.join(temp)
    df = df.drop('From_To', axis=1)
    
    我的做法    
    df['from'] = df['From_To'].str.split('_',expand=True)[0]
    df['to'] = df['From_To'].str.split('_',expand=True)[1]
    
    很明显,join更简洁,换个角度,如果列更多,我的方法就麻烦多了。
    strip有个expand参数,很重要。python中的split 没有这个参数。

      差别如下

  • 相关阅读:
    Object添加Symbol.iterator办法执行for--of
    二十四节气
    正则
    内容换行展示
    textarea 友好提示
    yyyy-MM-dd
    Repeater和PagedDataSource 绑定数据
    刷新 跳转 关闭 时弹窗
    SqlParameter CommandType.Text CommandType.StoredProcedure;
    JQuery disabled(禁用启用按钮)和display
  • 原文地址:https://www.cnblogs.com/654321cc/p/11950159.html
Copyright © 2011-2022 走看看