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 没有这个参数。
差别如下