《用pandas玩转数据》的精炼摘要
程序员文章站
2022-07-08 11:59:11
。...
1.pandas知识
①frame按照行列索引定位到某一行某一列
frame
'''
城市 环比 同比 定基
c1 北京 101.5 120.7 121.4
c2 上海 101.2 127.3 127.8
c3 广州 101.3 119.4 120.0
c4 深圳 102.0 140.9 145.5
c5 沈阳 100.1 101.4 101.6
'''
print(frame['同比'][0:2]) #找到某一行某一列,即使索引是C1,c2仍然可以frame[0:2]
print(frame[0:2]['同比']) #找到某一行某一列
print(frame['城市']) #找到某一列
print(frame[['城市','环比']] ) #找到某一列(这里必须是两个[])
print(frame[0:2]) #找到某一行。可以用数字找到某一行,但不能用索引。
print(frame['c2']) #这个输出会报错!!!c2是索引,frame[]不能通过索引查询指定行。
#找到某一列然后像字符串一样处理
print( frame['name'].str[0:1] )
print( frame['name'].str[0:1]+'同学' )
print( frame['height'].round(1) )#使用字符串的四舍五入
frame['环比']=frame['环比']+1
②frame
- 当然,frame[ ]也可以通过条件来定位那些行,如:
frame[ (frame['age']>17) ]
和frame[frame['gender']==True]
'''按条件查询'''
frame[frame['age'] >17]
frame[ (frame['age']>17) & (frame['height']>1.80) ]
frame[ (frame['age']>17) & (frame['gender']==True)]
frame[ frame['age'].isin([20,16]) ]
③关于frame.loc[ ]
之前讲的都是frame,现在我们来看看frame.loc[]
- 我们知道frame[‘c2’]是错误的表述,如果你实在是需要用索引查找,那就frame.loc[[‘c2’]]
- 当然,frame.loc[]不仅仅可以通过索引来定位那些行,还可以通过条件来定位那些行,如:
frame.loc[frame['gender']==True]
和frame.loc[frame['height']>1.80]
- frame.loc最常见的用法就是精确定位,如
frame.loc['c1','name']
精确定位某一行某一列,frame.loc[frame['height']>1.80,'age']
精确定位那些身高在180以上的那些人的年龄
frame.loc['c1','name']='赵春'
frame.loc[frame['height']>1.80,'age'] =frame.loc[frame['height']>1.80,'age'] +1
2.行列修改
①修改列名、行名
frame.columns=['学号','姓名','性别','年龄','身高']
frame.rename(columns={'ID':'学号','name':'姓名','gender':'性别'})
#我建议学习第二个,因为第二个更适合更改指定的列名,第一个一下子就全改了
②reindex调整行列顺序
import pandas as pd
d1={'城市':['北京','上海','广州','深圳','沈阳'],
'环比':[101.5,101.2,101.3,102.0,100.1],
'同比':[120.7,127.3,119.4,140.9,101.4],
'定基':[121.4,127.8,120.0,145.5,101.6]}
d=pd.DataFrame(d1,index=['c1','c2','c3','c4','c5'])
'''
城市 环比 同比 定基
c1 北京 101.5 120.7 121.4
c2 上海 101.2 127.3 127.8
c3 广州 101.3 119.4 120.0
c4 深圳 102.0 140.9 145.5
c5 沈阳 100.1 101.4 101.6
'''
d=d.reindex(index=['c5','c4','c3','c2','c1'])
'''
城市 环比 同比 定基
c5 沈阳 100.1 101.4 101.6
c4 深圳 102.0 140.9 145.5
c3 广州 101.3 119.4 120.0
c2 上海 101.2 127.3 127.8
c1 北京 101.5 120.7 121.4
'''
d=d.reindex(columns=['城市','同比','环比','定基'])
'''
城市 同比 环比 定基
c5 沈阳 101.4 100.1 101.6
c4 深圳 140.9 102.0 145.5
c3 广州 119.4 101.3 120.0
c2 上海 127.3 101.2 127.8
c1 北京 120.7 101.5 121.4
'''
③插入行列
'''新加一列'''
frame['newname']=frame['name'].str[0:1]+'同学' #新添加了一列
frame['class']=['C1','C1','C3','C1','C2','C3','C4']
frame.insert(2,'class',['C1','C1','C3','C1','C2','C3','C4']) #在第2列插入一列数据
'''新加几行'''
frame=frame.append( frame.loc[frame['gender']==True] )
data={'ID':['000001','000002','000003','000004','000005','000006','000007'],
'name':['黎明','赵春怡','张福平','百利','牛玉德','姚华','李楠'],
'gender':[True,False,True,False,True,False,True],
'age':[16,20,18,18,17,18,16],
'height':[1.88,1.78,1.81,1.86,1.74,1.75,1.76]
}
frame=pd.DataFrame(data)
data1={'ID':['000008'],
'name':['方文武'],
'gender':[False],
'age':[21],
"height":[1.71]
}
newframe=pd.DataFrame(data1)
frame=frame.append(newframe)
'reindex也可以新加一行和一列数据,而且优点是可以批量填补一些值'
newc = frame.columns.insert(2,'新增') #在第2列的位置添加一个"新增的列标题"
newd = frame.reindex(columns=newc,fill_value=200) #在NaN处填充200
nl=frame.index.insert(7,'c0')
nd=frame.reindex(index=nl,columns=newc,fill_value=200)
#值得注意的是把columns=newc改成columns=newd是错误的,因为newc是frame.columns,而newd是frame
'''删除行、删除列'''
frame=frame.drop('c1',axis=0) #值得注意的是在drop中axis=0是删除行,axis=1是删除列 ;axis=0可以省略
frame=frame.drop(['c1','c2'],axis=0) #删除行;axis=0可以省略
frame=frame.drop('name',axis=1) #删除name列
frame=frame.drop( index=( frame.loc[(frame['gender']==True)].index ) ) #删除性别为True的行;axis是默认为0的
3.排序、分组、拼接
'''排序'''
frame=frame.sort_values(by=['height'])
frame=frame.sort_values(by=['height'],ascending=False) #ascending表示升序,ascending=False自然就是降序
frame=frame.sort_values(by=['age','height'],ascending=[True,False]) #按照年龄升序身高降序
frame.sort_values(by=[3],axis=1) #按照第三行升序
'''数据的分组和聚合'''
groups=frame.groupby(frame['gender']) #按照性别分组
print(groups.count()) #分组后做统计分析
groups=frame[['ID','age']].groupby([frame['gender']]) #把ID和age按照性别分组-
print(groups.count().rename(columns={'ID':'IDcount','age':'ageCount'})) #分组后改一下列标头
groups=frame['age'].groupby(frame['age'])
print(groups.count().sort_values(ascending=False)) #按照统计结果的多少(不是按年龄)降序排列
groups=frame['age'].groupby(frame['age'])
print(groups.count().sort_index(ascending=False)) #按照(年龄)降序排列
groups=frame[['ID']].groupby([frame['gender'],frame['age']]) #把ID按照性别、年龄分组
print(groups.count().sort_values(by=['gender','age'],ascending=[False,True])) #按“性别升序,年龄降序”排序
frame['rating'].groupby([frame['gender'],frame['title']]).agg(['mean','count'])
等价于:
frame.groupby([frame['gender'],frame['title']]).agg(mean=('rating','mean'),count=('rating','count'))
'''对数据进行连接'''
sum=pd.merge(students,scores,left_on='ID',right_on='SID')
#pd.merge(列表1,列表2,列表1的连接项,列表2的连接项),这是依据列表1的连接项 和 列表2的连接项 将列表1和列表2连接起来
sum2=pd.merge(students,scores,left_on='ID',right_on='SID',how='left')
#加了how=left后就是以列表1为基准连接,列表2中有空值也会显示
sum3=pd.merge(students,scores,left_on='ID',right_on='SID',how='left')
print(sum3[ pd.isna(sum3['score'])==True ]['name']) #pd.isna(a)==True就是找到为空值的a
sum4=pd.merge(students,scores,left_on='ID',right_on='SID')
print( sum4[['score']].groupby(sum4['name']).mean() ) #将分数按照name分组,并求平均值
print(frame.pivot_table('rating',index='title',columns='gender',aggfunc='mean'))
'''pivot_table做一个透视图。因为有很多电影,所以我们把电影标题安排在行上;列展示性别;单元格里面显示评分的平均值'''
4.实例中的重点摘抄
1.电影评分数据集分析
frame['rating'].groupby([frame['gender'],frame['title']]).agg(['mean','count'])
frame['rating'].groupby([frame['gender'],frame['title']]).agg(['mean','count'])
.sort_values(by=['mean','count'],ascending=[False,False])
frame1=frame['rating'].groupby([frame['gender'],frame['title']]).agg(['mean','count'])
print(frame1[ frame1['count']>100 ].sort_values(by=['mean'],ascending=False)
print(frame.pivot_table('rating',index='title',columns='gender',aggfunc='mean'))
'''pivot_table做一个透视图。因为有很多电影,所以我们把电影标题安排在行上;列展示性别;单元格里面显示评分的平均值'''
print('------------------按照女性评分倒序排列 -----------------')
print(frame.pivot_table('rating',index='title',columns='gender',aggfunc='mean').sort_values(by='F',ascending=False))
frame=frame.pivot_table('rating',index='title',columns='gender',aggfunc='mean').loc[newframe.index[newframe>100]]
frame['differ']=frame['M']-frame['F']
print(frame)
2.股票数据
#grade是贷款的等级,sub_grade是将等级进一步细分,revol_util是透支额度
#将透支额度按贷款等级分组,并且统计每个分组里面的人数和这个分组的透支额度的平均值
import pandas as pd
data=pd.read_csv("loans.csv")
print(data.head(5))
data=data['revol_util'].groupby([data['grade'],data['sub_grade']]).agg(['count','mean'])
print(data)
#grade是贷款的等级,sub_grade是将等级进一步细分,revol_util是透支额度
#按贷款等级分组,并且统计每个分组里面的人数和这个分组的透支额度的平均值
import pandas as pd
data=pd.read_csv("loans.csv")
print(data.head(5))
data=data.groupby([data['grade'],data['sub_grade']]).agg(people_count=('revol_util','count'),revol_mean=("revol_util",'mean'))
print(data)
import pandas as pd
frame=pd.read_csv('F:\\python数据\\test7.csv',encoding='gbk')
frame=frame.set_index('日期')
frame.index=pd.to_datetime(frame.index)
results=frame.groupby([frame.index.year,frame.index.month]).agg(val1=('收盘价','mean'),val2=('换手率','mean'),val3=('成交笔数','mean'))
print(results)
3.黑色星期五顾客消费分析
print(frame.corr())
'''看一下相关性,corr()会把csv文件中列的内容是数字的那些列(数字列)两两计算它们的相关性(接近1的就是相关的)。由于在我们的文件中年龄那一列是0-17这样的区间,没有办法计算它与其他列的相关性;居住时长那一列有4+这样的表示,也没有办法计算它与其他列的相关性'''
frame['Age']=frame['Age'].apply(lambda x:x[0])
frame.loc[frame['Stay_In_Current_City_Years']=='4+','Stay_In_Current_City_Years']=4
frame['Age']=frame['Age'].astype(int) #刚才的列是字符串类型,我们得转换为int
frame['Stay_In_Current_City_Years']=frame['Stay_In_Current_City_Years'].astype(int)
print(frame.corr())
4.查看我国各省的GDP
frame[['地区','2019年']]
frame[['地区','2019年']].values.tolist()
5.查看我国人口流动数据
results=frame[frame['count'] >100000][['from','to']].values.tolist() #统计流动人口大于100000的
import pandas as pd
frame=pd.read_csv('F:/python海量数据/population.csv',encoding='gbk')
print(frame[frame['count'] >100000][['from','to']])
print(frame[frame['count'] >100000][['from','to']].values) #转成numpy类型
print(frame[frame['count'] >100000][['from','to']].values.tolist()) #numpy.tolist()
6.查看一百年前南方小镇的社交明星
略
本文地址:https://blog.csdn.net/weixin_45014721/article/details/109471533