python基础3:Pandas中常用操作

借了一张图

Pandas:提供名为DataFrame的数据结构,比较契合统计分析中的表结构,做数据分析用的,主要是做表格数据呈现。

每次在使用Pandas的时候,不是看记的笔记就是百度,这里集中整理一下

目录:
1、创建一个空的DataFrame
2、txt、csv、excel、数据库 数据读取
3、3、数据写出。如将数据导入数据库,或导出为excel文件
4、排序
5、计算某列有多少个不同的值,类似sql中distinct
6、分组函数(类似sql中group by)
7、截取某字段中前5个字符(注意:前闭后开)
8、删除floor字段中的'层'字,其它内容保留。
9、agg函数—常与groupby函数连用。如:每个大陆对饮品消耗的最小值、平均值、最大值
10、在字段中对数据进行模糊匹配,类似sql中like
11、数据筛选,类似sql中like
12、多个数据条件筛选,类似sql中and 、or
13、pivot_table类似excel中数据透视表
14、合并两个dateframe,类似sql中union all 、left join
15、DataFrame删除某列
16、填充DataFrame中的空值
17、对df中的某个字段进行分割,一个字段拆分为多个字段
18、对df中的某个字段分层。类似sql中case when
19、数据提取。如选取某个字段,某行
20、统计函数(平均值,最大值,最小值,标准差,中位数等)
21、对某列累加求和cumsum()
22、对日期的处理。(如时间数据类型转换,时间加减)
23、对数据进行去重drop_duplicates()
24、字典转化为DataFrame
25、修改字段名rename
26、数据类型转换
27、计算环比pct_change()
28、数据转置行变成列。df.T
29、查看数据常用操作。如多少行多少列、列字段及数据类型等

1、创建一个空的DataFrame
a = pd.DataFrame()
2、txt、csv、excel、数据库 数据读取
1、读取txt文件
【方法一】
df = pd.read_table("F:/datafrog/2-PYTHON/CDNOW_master.txt",names = ['user_id','order_dt','order_products','order_amount'],sep = '\s+')
【方法二】
columns = ['user_id','order_dt','order_products','order_amount']
df = pd.read_table("CDNOW_master.txt",names = columns,sep = '\s+')

#因为原始数据不包含表头,所以需要赋予"names"。字符串是空格分割,用"\s+"表示匹配任意空白符。

2、读取CSV文件
df = pd.read_csv("F:/datafrog/2-PYTHON/链家二手房.csv",sep = ',',engine = 'python')

3、读取excel文件
data = pd.read_excel("F:/datafrog/201708收银.xlsx")

4、数据库读取(MYSQL)
#导入模块
from sqlalchemy import create_engine
import pymysql
pymysql.install_as_MySQLdb()   # 为了兼容mysqldb
#创建连接
engine = create_engine('mysql://用户名:密码@IP地址:端口/数据库?charset=gbk')
conn = engine.connect() 
#读取数据
data1 = pd.read_sql_query('select * from data', con=conn)
print(data1.head())

参考文章:Python之Pandas知识点,详细参数讲解可看此文章

3、数据写出。如将数据导入数据库,或导出为excel文件
1、将数据写出为csv
import pandas as pd
data.to_csv('数据储存位置',index =  是否导出索引)
#data.to_csv('data.csv',index = False)

2、将数据写出为excel
data.to_excel('数据储存位置',index=是否导出索引)
#data.to_excel('data.xlsx',index=False)

3、将数据写入数据库
#不用在数据库中建表,在导入过程中会自动在数据库中建表
from sqlalchemy import create_engine #导入模块
engine =create_engine('mysql+pymysql://root:root@127.0.0.1/data?charset=utf8', encoding='utf-8', echo=True)#创建数据库链接
conn = engine.connect()
create_merchant.to_sql('HZ_CREATE_CUSTOMER',con=datafrog,if_exists='append',index=False)
#data.to_sql('data',con = conn)

参考文章:Python之Pandas知识点,详细参数讲解可看此文章。

4、排序
1、按照1个字段排序
df.sort_values(by = 'quantity',ascending=False)  # False降序
#ascending = False,降序
#ascending = True,升序

2、按照2个及以上字段排序
df.sort_values(by = ['quantity','month'],ascending=False) # False降序
5、计算某列有多少个不同的值,类似sql中distinct
1、计算每个不同值有在该列中有多少重复值
【方法一】
chipo['choice_description'].value_counts()
【方法二】
df["User_ID"].drop_duplicates(keep='first').count()

2、计算某列有多少个不同的重复值
df['User_ID'].nunique()

6、分组函数(类似sql中group by)
1、按照1个字段分组
df.groupby('key1').order.mean() 

2、按照2个字段分组
df.groupby(['month','chty']).order.mean() 
7、截取某字段中前5个字符(注意:前闭后开)
df[" 地址"] = df["地址"].str[0:5]
8、删除floor字段中的'层'字,其它内容保留。
df['floor'] = df['floor'].str.extract('(\d+)层')
9、agg函数—常与groupby函数连用。如:每个大陆对饮品消耗的最小值、平均值、最大值
chipo.groupby('order_id').agg({'item_price_01':'sum'}).item_price_01.mean()

2、每个大陆对饮品消耗的最小值、平均值、最大值
drinks.groupby('continent')['spirit_servings'].agg(['min','mean','max'])

案例:
df.groupby('area_level').agg({'面积':'sum','面积':'mean','单价(平方米)':'mean','价格(W)':'mean'})

类似SQL中:
Select userid,max(monitortime),avg(prince)  from student group by userid
10、在字段中对数据进行模糊匹配,类似sql中like
1、筛选某字段以G开头的数据
euro12[euro12.Team.str.startswith('G')]

2、筛选某字段以G结束的数据
euro12['Team'].str.endwith('G')

11、数据筛选,类似sql中like
1、选取队名为'England','Italy','Russia' 的所有数据
Euro12[euro12['Team'].isin(['England','Italy','Russia'])]

2、筛选不是欧洲队的所有数据
Euro12[~euro12['Team'] == '欧洲队')]

3、筛选小区名称有"阳光"二字的所有小区数据
【方法一】
df1[df1['小区名称'].str.contains('阳光')]  
【方法二】
df[df["小区名称"].str.contains(r'.*?阳光.*')]
【方法三】
df[df["小区名称"].isin(["阳光"])]
#类似sql中   select   *  from   df where  小区名称  like '%阳光%’

3、筛选小区名称有"阳光"或者'雅居’二字的所有小区数据
df1[df1['小区名称'].str.contains('阳光|雅居')]  
#类似where 小区名称 like '%阳光%’or 小区名称 like '%雅居%’

4、选取以字母G开头的球队数据
euro12[euro12.Team.str.startswith('G')]
12、多个数据条件筛选,类似sql中and 、or
1、筛选时间大于2019-3-12并且小于2019-12-12所有数据
df[(df.create_date>= '2019-3-12') & (df.create_date<= '2019-12-12')]


2、筛选时间不在2019-3-12至2019-12-12的数据
df[(df.create_date>= '2019-3-12') | (df.create_date<= '2019-12-12')]
13、pivot_table类似excel中数据透视表
【案例1】
hz_customer_order.pivot_table(index = 'product_name',
                              columns='create_year_month',
                    values = 'order_num',
                    aggfunc = 'sum')

【案例2】
df.pivot_table(index = 'user_id',
                    values = ['order_products','order_amount','order_dt'],
                    aggfunc = {'order_products':'max','order_amount':'sum','order_products':'sum'})

【案例3】
df.pivot_table(index = 'user_id',
              columns = 'month',
              values = 'order_dt',
              aggfunc  = 'count')
14、合并两个dateframe,类似sql中union all 、left join
1、合并两张表行的维度合并,类似sql中union all
#在合并两张表的时,索引一定要相同,或者会报错
pd.concat([data1,data2],axis = 0)

2、合并两张表,按照列的维度合并,类似sql中left join
#在合并两张表的时,索引一定要相同,或者会报错
pd.concat([data1,data2],axis = 1)

3、两张表按照某字段合并:
#类似sql中left join
pd.merge(all_data, data3, on='subject_id')

4、两张表根据某2个字段合并:
#类似sql中left join
pd.merge(all_data, data3, on=['subject_id','class'])
15、DataFrame删除某列
1、删除某列,不改变数据集,返回一个新的DataFrame
df_gender_purchase.drop(labels='消费金额1',axis=1) 

2、会改变原始数据集
df_gender_purchase.drop(labels = '消费金额1',axis = 1,inplace = True)  

df_gender_purchase = df_gender_purchase.drop(labels='消费金额1',axis=1)   

//删除total列
del crime['Total']
16、填充DataFrame中的空值
1、整张表的空值用0填充
df2.floor.fillna(0)

2、使用price平均值对空值进行填充
df['price'].fillna(df['price'].mean())  

df.isnull()  #检查数据空值
df['price'].isnull()  #检查特定列空值
17、对df中的某个字段进行分割,一个字段拆分为多个字段
df['floor'].str.split('/',expand = True)]
18、对df中的某个字段分层。类似sql中case when
【案例1】
#方法1
df.loc[(df['面积'] >= 0) & (df['面积'] < 50),'area_level'] = '极小户型'
df.loc[(df['面积'] >= 50) & (df['面积'] < 100),'area_level'] = '小户型'
df.loc[(df['面积'] >= 100) & (df['面积'] < 150),'area_level'] = '中等户型'
df.loc[(df['面积'] >= 150) & (df['面积'] < 200),'area_level'] = '大户型'
df.loc[(df['面积'] >= 200),'area_level'] = '巨大户型'
#方法2
df['area_level'] = pd.cut(df['面积'], [0,50,100,150,200], labels=["极小户型","小户型","中等户型","大户型","巨大户型"])

【案例2】
sales_customer_order_11['age_level'] = pd.cut(sales_customer_order_11['customer_age'], [30,35,40,45,50,55,60,65], labels=["30-34","35-39","40-44","45-49","50-54","55-59","60-64"])
19、数据提取。如选取某个字段,某行
df['股票代码']    # 根据列名称来选取,读取的数据是Series类型
df[['股票代码', '收盘价']]   # 同时选取多列,需要两个括号,读取的数据是DataFrame类型

df.iloc[0]   # 以index选取某一行,读取的数据是Series类型
df.iloc[1:3]   # 选取第一行到第二行的数据,读取的数据是DataFrame类型
df.iloc[:, 1:3] # 选取所有行,第第一列到第二列的数据
20、统计函数(平均值,最大值,最小值,标准差,中位数等)
【方法一】
df.describe()

【方法二】
df['收盘价'].max()  # 最大值
df['收盘价'].min()  # 最小值
df['收盘价'].std()  # 标准差
df['收盘价'].count()  # 非空的数据的数量
df['收盘价'].median()  # 中位数
df['收盘价'].quantile(0.25)  # 25%分位数
df['收盘价'].mean()  # 求一整列的均值,返回一个数。会自动排除空值。
21、对某列累加求和cumsum()
df['order'].cumsum()

【案例】
用户累计消费金额的占比(百分之多少的用户占了百分之多少的消费额)
group_user.sum().sort_values(by = 'order_amount',ascending = True).cumsum()/2500315.6300000004

#方法一:
user_cumsum = (group_user.sum().sort_values('order_amount').cumsum()/2500315.63
#方法二:
user_cumsum = group_user.sum().sort_values('order_amount').apply(lambda x: x.cumsum() / x.sum())
user_cumsum
#axis = 0按列计算
#cumsum滚动累加求和
22、对日期的处理。(如时间数据类型转换,时间加减)
1、字符串转时间
#注意时间的格式
df_dw_customer_order['create_date'] = pd.to_datetime(df_dw_customer_order.create_date,format = '%Y-%m-%d')  

2、将年转化为时间格式的年
pd.to_datetime(crime.Year, format='%Y')

pd.to_datetime('2017/09/24',format='%Y-%m-%d')  
//Timestamp('2017-09-24 00:00:00')

pd.to_datetime('2017/09/24 11:38:30',format='%Y-%m-%d %H:%M:%S')
//Timestamp('2017-09-24 11:38:30')

pd.to_datetime('2017/09/24 11:38:30',format='%Y/%m/%d %H:%M:%S')
//Timestamp('2017-09-24 11:38:30')

2、时间转化为字符串
hz_customer_order['create_date'].apply(lambda x:x.strftime('%Y-%m-%d'))


3、计算两个时间相差的天数,并把结果转为整数
(rfm.order_dt.max()-rfm.order_dt)/np.timedelta64(1,'D')

4、pandas当前时间减一天
datetime.date.today() + datetime.timedelta(days=-1)
23、对数据进行去重drop_duplicates()
#df3中有重复的行数,我们如何将重复的行数去除?
df3.drop_duplicates(
    subset=['收盘价', '交易日期'],  # subset参数用来指定根据哪类类数据来判断是否重复。若不指定,则用全部列的数据来判断是否重复
    keep='first',  # 在去除重复值的时候,我们是保留上面一行还是下面一行?first保留上面一行,last保留下面一行,False就是一行都不保留
    inplace=True

【案例一】
df['city'].drop_duplicates(keep='last')  #删除先出现的重复值
df['city'].drop_duplicates()   #删除后出现的重复值

24、字典转化为DataFrame
【案例一】
pd.DataFrame({'a':'int','b':'str'})

【案例二】
将[{'a':'int','b':'str'},{'a':'cat','b':'dog'}]变成datafram
df = pd.DataFrame(newlist)
25、修改字段名
df1.rename(columns = {"name":"姓名","id":"序号"},inplace = True)
26、数据类型转换
1、字符串转时间
#注意时间的格式
df_dw_customer_order['create_date'] = pd.to_datetime(df_dw_customer_order.create_date,format = '%Y-%m-%d')

2、时间转化为字符串
hz_customer_order['create_date'].apply(lambda x:x.strftime('%Y-%m-%d'))

df_dw_customer_order['order'].astype(int)#将order转化为整数
df_dw_customer_order['order'].astype(str)#将order转化为字符串格式
27、计算环比pct_change()
【案例一】
product_name_list = list(gather_customer_order_month_10_11.product_name.drop_duplicates())
order_top_x = pd.Series([])
for i in product_name_list:
    #print(i)
    a=gather_customer_order_month_10_11.loc[gather_customer_order_month_10_11['product_name']==i]['order_month_product'].pct_change().fillna(0)
    #b=gather_customer_order_month_10_11.loc[gather_customer_order_month_10_11['product_name']==i]['sum_amount'].pct_change().fillna(0)
    order_top_x=order_top_x.append(a) 
28、数据转置行变成列。df.T
df.T
29、查看数据常用操作。如多少行多少列、列字段及数据类型等
df.shape  # 数据维度(行列)
df.shape[0]  # 数据行数
df.columns  #查看列名称
df.index # 查看索引
df.info()  #数据表信息:数据维度、列名称、数据格式和所占空间等信息
df.dtypes  #查看数据表各列格式
df['B'].dtype  #查看单列格式
df['name'].unique  #查看name中的唯一值
df.head(3)  # 看前3行的数据
df.tail(3)  # 看最后3行的数据
df.describe()  # 描述函数,最大值最小值中位数等
文章持续更新中!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351