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 没有这个参数。

  差别如下

 

 

posted @ 2019-11-28 15:06  骑者赶路  阅读(2568)  评论(0编辑  收藏  举报