得到
df2 = DataFrame(np.arange(9).reshape(3,3), index=['A','B','C'], columns=['BJ','SH','GZ'])得到
#加法符合点加点乘等 df1 + df2得到
#定义一个新的DataFrame df3 = DataFrame([[1,2,3],[4,5,np.nan],[7,8,9]],index=['A','B','C'],columns=['c1','c2','c3'])得到
#求列和,但NaN不参加计算 df3.sum() ''' 得到 c1 12.0 c2 15.0 c3 12.0 dtype: float64 ''' #求行和,但NaN不参加计算,axis=1为行 df3.sum(axis=1) ''' 得到 A 6.0 B 9.0 C 24.0 dtype: float64 ''' #求最小值,同sum,NaN不参加计算,默认为列,axis=1为行 df3.min() ''' 得到 c1 1.0 c2 2.0 c3 3.0 dtype: float64 ''' #求最大值,同sum,NaN不参加计算,默认为列,axis=1为行 df3.max() ''' 得到 c1 7.0 c2 8.0 c3 9.0 dtype: float64 ''' #求统计数据,同其他,NaN不参加计算,默认为列,axis=1为行 df3.describe()得到
得到
#DataFrame整体的排序(指定A列) df2 = df1.sort_values('A')得到
#再将新的DataFrame的Index排序 df2.sort_index()得到
得到
df1.index ''' 得到 Index(['BJ', 'SH', 'GZ'], dtype='object') ''' #修改Index的第一种方法 df1.index = Series(['bj','sh','gz'])得到
df1.index ''' 得到 Index(['bj', 'sh', 'gz'], dtype='object') ''' #Map的方法,传入一个函数 df1.index = df1.index.map(str.upper)得到
#rename传入函数的方法 df1.rename(index=str.lower, columns=str.lower)得到
#rename传入字典的方法 df1.rename(index={'BJ': 'beijing'}, columns={"A":'a'})得到
#for循环方法的回顾list1转换为list2 list1 = [1,2,3,4] list2 = ['1','2','3','4'] [str(x) for x in list1] ''' 得到 ['1', '2', '3', '4'] ''' #map方法的回顾list1转换为list2 list(map(str, list1)) ''' 得到 ['1', '2', '3', '4'] ''' #写一个自己的函数,来让map接收 def test_map(x): return x + '_ABC' df1.index.map(test_map) ''' 得到 Index(['BJ_ABC', 'SH_ABC', 'GZ_ABC'], dtype='object') ''' #写一个自己的函数,来让rename接收 df1.rename(index=test_map)得到
得到
df2 = DataFrame({'key':['X','B','C'], 'data_set_2':[4,5,6]})得到
#找相同的column,再找column下数值一样的元素,并放在同一个DataFrame里 pd.merge(df1, df2, on=None)得到
#on参数的意思是指定对比的column,inner默认,只合并都有的元素,其它忽略 pd.merge(df1, df2, on='key',how='inner')得到
#how='left',以第一个DataFrame的数值为主合并,没有的填充NaN pd.merge(df1, df2, on='key', how='left')得到
#how='right',以第二个DataFrame的数值为主合并,没有的填充NaN pd.merge(df1, df2, on='key', how='right')得到
#how='outer',以两个DataFrame的数值全部合并,没有的填充NaN pd.merge(df1, df2, on='key', how='outer')得到
得到
df2 = DataFrame(np.random.randn(3,3), columns=['X','Y','A'])得到
#DataFrame的concatenate,整个DataFrame同column连接,缺少值填充NaN pd.concat([df1,df2])得到
得到
df2 = DataFrame({ 'Z':[np.nan, 10, np.nan, 12], 'A':[1,2,3,4] })得到
#用df2填充df1,将df1里缺少的位置,用df2对应位置的数值填充,另外会将df2比df1多的列也加入结果中 df1.combine_first(df2)得到
得到
#行数 df.size ''' 得到 7978 ''' #创建一个新的Series s1 = Series(['a']*7978) df['A'] = s1 df.head()得到
#Series'A'的变成大写 df['A'] = df['A'].apply(str.upper) df.head()得到
#把data变成三列,用空格区分并且去掉 l1 = df['data'][0].strip().split(' ') l1[1], l1[3],l1[5] ''' 得到 ('APPL', '0', '1623') ''' #把data变成三列,定义函数 def foo(line): items = line.strip().split(' ') return Series([items[1], items[3], items[5]]) #用apply应用函数 df_tmp = df['data'].apply(foo) #columns重命名 df_tmp = df_tmp.rename(columns={0:"Symbol", 1:"Seqno", 2:"Price"}) df_tmp.head()得到
#df不变 df.head()得到
#联合df_tmp和df df_new = df.combine_first(df_tmp) df_new.head()得到
#删除两列 del df_new['data'] del df_new['A'] df_new.head()得到
#将结果传回文件 df_new.to_csv('../homework/demo_duplicate.csv') 得到 apply_demo.csv demo_duplicate.csv iris.csv movie_metadata.csv得到
#['Seqno']行数据是否为重复的 df['Seqno'].duplicated() ''' 得到 0 False 1 True 2 True 3 True 4 False 5 True 6 True 。。。 Name: Seqno, Length: 3989, dtype: bool ''' #去掉重复操作,以['Seqno']行数据为基准,keep默认是first,去重只保留第一个,last保留最后一个 df.drop_duplicates(['Seqno'],keep='last')得到 1000 rows × 4 columns
得到
#创建一个图表 stock_df.plot() 得到 <matplotlib.axes._subplots.AxesSubplot at 0x1108e3198> #导入一个plot的库 import matplotlib.pyplot as plt #展示图表 plt.show()得到
#创建空的DataFrame weekly_df = DataFrame() #按周采样,平均值 weekly_df['BABA'] = stock_df['BABA'].resample('W').mean() weekly_df['TENCENT'] = stock_df['TENCENT'].resample('W').mean() weekly_df.head()得到
#产生图表 weekly_df.plot() 得到 <matplotlib.axes._subplots.AxesSubplot at 0x1108e30f0> #展示图表 plt.show()得到
得到
得到
#将['city']列分组 g = df.groupby(df['city']) ''' 得到 <pandas.core.groupby.DataFrameGroupBy object at 0x10d45a128> ''' #得到分组的Index情况 g.groups ''' 得到 {'BJ': Int64Index([0, 1, 2, 3, 4, 5], dtype='int64'), 'GZ': Int64Index([14, 15, 16, 17], dtype='int64'), 'SH': Int64Index([6, 7, 8, 9, 10, 11, 12, 13], dtype='int64'), 'SZ': Int64Index([18, 19], dtype='int64')} ''' #过滤出某一个分组的情况 df_bj = g.get_group('BJ') #单一一个分组的平均值是一个Series type(df_bj.mean()) ''' 得到 pandas.core.series.Series ''' #求所有分组的均值,最大值max,最小值min g.mean()得到
得到
#转换为列表 list(g) ''' 得到 [('BJ', date city temperature wind 0 03/01/2016 BJ 8 5 1 17/01/2016 BJ 12 2 2 31/01/2016 BJ 19 2 3 14/02/2016 BJ -3 3 4 28/02/2016 BJ 19 2 5 13/03/2016 BJ 5 3), ('GZ', date city temperature wind 14 17/07/2016 GZ 10 2 15 31/07/2016 GZ -1 5 16 14/08/2016 GZ 1 5 17 28/08/2016 GZ 25 4), ('SH', date city temperature wind 6 27/03/2016 SH -4 4 7 10/04/2016 SH 19 3 8 24/04/2016 SH 20 3 9 08/05/2016 SH 17 3 10 22/05/2016 SH 4 2 11 05/06/2016 SH -10 4 12 19/06/2016 SH 0 5 13 03/07/2016 SH -9 5), ('SZ', date city temperature wind 18 11/09/2016 SZ 20 1 19 25/09/2016 SZ -10 4)] ''' #遍历所有的group for name, group_df in g: print(name) print(group_df) ''' 得到 BJ date city temperature wind 0 03/01/2016 BJ 8 5 1 17/01/2016 BJ 12 2 2 31/01/2016 BJ 19 2 3 14/02/2016 BJ -3 3 4 28/02/2016 BJ 19 2 5 13/03/2016 BJ 5 3 GZ date city temperature wind 14 17/07/2016 GZ 10 2 15 31/07/2016 GZ -1 5 16 14/08/2016 GZ 1 5 17 28/08/2016 GZ 25 4 SH date city temperature wind 6 27/03/2016 SH -4 4 7 10/04/2016 SH 19 3 8 24/04/2016 SH 20 3 9 08/05/2016 SH 17 3 10 22/05/2016 SH 4 2 11 05/06/2016 SH -10 4 12 19/06/2016 SH 0 5 13 03/07/2016 SH -9 5 SZ date city temperature wind 18 11/09/2016 SZ 20 1 19 25/09/2016 SZ -10 4 ''' #类似数据库的运算如下 select * from table_1 group by column_1得到 。。。
#数据分组,得到分组数据 g =df.groupby('city') #数据的一般聚合,与分组直接得到结果一致 g.agg('min')得到
#数据的函数聚合,可以定义一个函数进行操作 #最大值减最小值 def foo(attr): return attr.max() - attr.min() #使用函数进行聚合操作 g.agg(foo)得到
#用两列进行数据分组 g_new = df.groupby(['city', 'wind']) ''' 得到 <pandas.core.groupby.DataFrameGroupBy object at 0x10f9c75c0> ''' #使用两个参数找到分组 g_new.get_group(('BJ',3))得到
#使用一个参数也可以找到分组 g.get_group('BJ')得到
#遍历两个参数的分组 for (name_1,name_2), group in g_new: print(name_1,name_2) print(group)得到 BJ 2 date city temperature wind 1 17/01/2016 BJ 12 2 2 31/01/2016 BJ 19 2 4 28/02/2016 BJ 19 2 BJ 3 date city temperature wind 3 14/02/2016 BJ -3 3 5 13/03/2016 BJ 5 3 BJ 5 date city temperature wind 0 03/01/2016 BJ 8 5 GZ 2 date city temperature wind 14 17/07/2016 GZ 10 2 GZ 4 date city temperature wind 17 28/08/2016 GZ 25 4 GZ 5 date city temperature wind 15 31/07/2016 GZ -1 5 16 14/08/2016 GZ 1 5 SH 2 date city temperature wind 10 22/05/2016 SH 4 2 SH 3 date city temperature wind 7 10/04/2016 SH 19 3 8 24/04/2016 SH 20 3 9 08/05/2016 SH 17 3 SH 4 date city temperature wind 6 27/03/2016 SH -4 4 11 05/06/2016 SH -10 4 SH 5 date city temperature wind 12 19/06/2016 SH 0 5 13 03/07/2016 SH -9 5 SZ 1 date city temperature wind 18 11/09/2016 SZ 20 1 SZ 4 date city temperature wind 19 25/09/2016 SZ -10 4
得到
#pivot_table的参数包括DataFrame名称,索引-以哪几列为基准进行汇总,前后需要有包含关系,数值-汇总哪几个数值,列名-以哪几列作为分类标准,空栏填充数,汇总方式(求和)默认为平均值 pd.pivot_table(df, index=['Manager','Rep'],values=['Price','Quantity'],columns=['Product'], fill_value=0, aggfunc='sum')得到
得到
df.tail()得到
#获取延误时间最长top10的航空公司 #用哪个列排序,升序/降序(降序)筛选前十个数据,规定显示的行数 df.sort_values('arr_delay', ascending=False)[:10][['flight_date','unique_carrier','flight_num','origin','dest','arr_delay']]得到
#计算延误和没有延误所占比例 #计算航班取消的数量 df['cancelled'].value_counts() ''' 得到 0 196873 1 4791 Name: cancelled, dtype: int64 ''' #筛选延误航班的数据,应用lambda表达式,选取数值大于0的 #增加一列 df['delayed'] = df['arr_delay'].apply(lambda x: x > 0) df.head()得到
#对['delayed']行进行数据统计 delay_data = df['delayed'].value_counts() ''' 得到 False 103037 True 98627 Name: delayed, dtype: int64 ''' #使用数据进行结果计算 delay_data[1]/(delay_data[0] + delay_data[1]) ''' 得到 0.48906597112027927 ''' #每一个航空公司延误的情况 #数据分组航空公司和是否延误列 delay_group = df.groupby(['unique_carrier','delayed']) ''' 得到 <pandas.core.groupby.DataFrameGroupBy object at 0x10d7c16a0> ''' #group.size()得到的是一个多级Series,将Series转换为DataFrame df_delay = delay_group.size().unstack()得到
#画图展示情况 import matplotlib.pyplot as plt df_delay.plot(kind='barh', stacked=True, figsize=[16,6], colormap='winter') ''' 得到 <matplotlib.axes._subplots.AxesSubplot at 0x118e99208> ''' plt.show()得到
#透视表功能 #透视表的参数,以flight_date列为汇总依据,按照unique_carrier列分类,计算数据flight_num,计算计数量 flights_by_carrier = df.pivot_table(index='flight_date', columns='unique_carrier', values='flight_num', aggfunc='count') flights_by_carrier.head()得到