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 沒有這個參數。

  差別如下

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM