# top_pandas_50 **Repository Path**: public_static_void/top_pandas_50 ## Basic Information - **Project Name**: top_pandas_50 - **Description**: 数据框架Pandas应用题 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-12-07 - **Last Updated**: 2024-12-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # top_pandas_50 #### 介绍 高频 SQL 50 题(基础版): https://leetcode.cn/studyplan/sql-free-50/ #### 一点总结: 1、熟悉pandas中两种数据结构Series、DataFrame Series可以理解为一维的数据序列;DataFrame可以理解为二维的数据表格。 DataFrame['column']返回一个Series,可以看出DataFrame由多个Series(列)构成,DataFrame赋予了这些Series列标签名。 2、pandas轴的概念 轴(axis)是一个用于指定数据操作方向的重要概念。 DataFrame:二维表有行和列,对应着纵轴(axis=0)和横轴(axis=1),分别对应着垂直操作(按行方向操作)和水平操作(按列方向操作)。 例如:要汇总每一列值df.sum(axis=0), 汇总每一行值df.sum(axis=1);合并行df.concat([df1, df2], axis=0),合并列df.concat([df1, df2], axis=1)。 Series:一维结构,只有垂直方向(axis=0)。 3、[] VS () []: 跟Python语言一样,用来索引位置,有很多不同的索引方式: df[]、df[[]]、df.loc[]、df.iloc[]、df.at[]、df.iat[]。 df.at[]、df.iat[]用来索引df中指定行指定列的单个数据;df.loc[]、df.iloc[]可以实现相同的功能,但它们支持分片。 df[] 可以传入一个True/False的序列用来过滤数据,比如df[ df['age' >=35 ]], 其中df['age' >=35 ]产生的就是一个True/False序列。 (): 通常用在方法或者函数的调用。 4、pandas同一语义多种表达 想要实现一个功能,pandas通常有多种表达方式,选择你比较习惯的一种方式来解决,或者记住一两种方式基本上就可以满足日常需求。 如:创建一个DataFrame (1)、pd.DataFrame({'id': [1,2,3]}, 'name': ['zhangsan', 'Lisi', 'Wangwu']) (2)、pd.DataFrame([[1,'Zhangsan'],[2,'Lis'],[3, 'Wangwu']], columns=['id', 'name']) 分组聚合,我更加习惯第三种,它更加通用而且可以自定义聚集列名 (1)、df.groupby(['machine_id', 'process_id'], as_index=False)['processing_time'].sum() (2)、df.groupby(['machine_id', 'process_id'], as_index=False).agg({'processing_time':'sum'}) (3)、df.groupby(['machine_id', 'process_id'], as_index=False).agg(sum=('processing_time', 'sum')) 关联方式: (1)pd.merge(visits, transactions, how='left', on='visit_id') (2)visits.merge(transactions, how="left", on="visit_id") 5、pandas方法的调用 pandas中常用的两类方法: pandas包提供的api:如pd.merge、pd.concat、pd.read_csv、pd.read_sql、pd.Timedelta等,都是以pd.调用的。 DataFrame对象方法:如df.groupby、df.sort_value、df.rename、apply等, 这些都是作用在df上的。 6、df.apply()方法和lambda表达式 apply()方法可以更加灵活的处理数据,参数是一个函数,通常用一个lambda表达式来代替,注意不同场景下参数代表的不同含义。 (1)x代表df中的一行(包含多列) products.apply(lambda x: 10 if x['change_date'] > pd.to_datetime('2019-08-16') else x['new_price'], axis=1) (2)x代表series中的一行(一列) cond = users['mail'].apply(lambda x: True if re.match(r'^[a-zA-Z][0-9a-zA-Z_./-]*@leetcode[.]com$', x) else False) (3)x代表每一个分组 managers = employees.groupby('reports_to', as_index=False).agg( reports_count=('employee_id', 'count'), average_age=('age', lambda x: np.round((x + 0.1).mean(), 0))) 7、pandas使用陷阱 (1)inplace参数 很多方法中提供了inplace参数,代表可以原地修改df, 如果不指定又不重新赋值,df是没有修改的。 错误: df.sort_values(by='employee_id', ascending=True) 正确: df = df.sort_values(by='employee_id', ascending=True) df.sort_values(by='employee_id', ascending=True, inplace=True) (2)类型不一致 无法过滤出202002月份数据,strftime('%Y%m')返回的是str类型 错误: orders[orders['order_date'].dt.strftime('%Y%m') == 202002] 正确: orders[orders['order_date'].dt.strftime('%Y%m') == '202002'] (3)空值的判断 错误: employees['manager_id'] == np.nan 正确: employees['manager_id'].isnull() 8、pandas的整洁之道 pandas代码通常可以写成一行(每个中间结果都是df),请换行或者拆分。 df = pd.merge(pd.read_csv('data.csv').assign(new_column=lambda x: x['column1'] + x['column2']).dropna(subset=['new_column']), other_df, on='key_column', how='left').rename(columns={'old_name': 'new_name'}).drop_duplicates(subset=['subset_column1', 'subset_column2']) ......