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 沒有這個參數。
差別如下