|
一、DataFrame整体情况查询
df.head(3)显示头部几行,默认5行
df.tail(3)显示末尾几行,默认5行
df.info()相关信息概览:行数、列数、列索引,列非空值个数,列类型;内存占用等信息
df.descrice()快速综合统计结果:计数、均值、标准差、最大值、四分位数、最小值
d1 = {'name':['xiaohong','xiaoang'],'age':[30,32],'tel':[10086,10010]} df = pd.DataFrame(d1) print(df.shape) #(2, 3) print(df.dtypes) #显示列数据类型 ''' name object age int64 tel int64 dtype: object ''' print(df.ndim) #数据维度,2 print(df.index) # 行索引 RangeIndex(start=0, stop=2, step=1) print(df.columns) #列索引 Index(['name', 'age', 'tel'], dtype='object') print(df.values) #对象值,二维ndarray数值 ''' [['xiaohong' 30 10086] ['xiaoang' 32 10010]] ''' print(df.head(3)) ''' name age tel 0 xiaohong 30 10086 1 xiaoang 32 10010 ''' print(df.tail(1)) ''' name age tel 1 xiaoang 32 10010 ''' print(df.info()) # 展示df的概览 ''' <class 'pandas.core.frame.DataFrame'> RangeIndex: 2 entries, 0 to 1 Data columns (total 3 columns): name 2 non-null object age 2 non-null int64 tel 2 non-null int64 dtypes: int64(2), object(1) memory usage: 176.0+ bytes None ''' print(df.describe()) ''' age tel count 2.000000 2.000000 mean 31.000000 10048.000000 std 1.414214 53.740115 min 30.000000 10010.000000 25% 30.500000 10029.000000 50% 31.000000 10048.000000 75% 31.500000 10067.000000 max 32.000000 10086.000000
动手
那么回到之前我们读取的够名字统计的数据上,我们尝试刚刚的方法
那么问题来了:
很多同学肯定想知道使用次数最高的前几个名字是什么呢?
df.sort_values(by='Count_AnimalName',ascending=False)
那么问题来了:如果我的数据有10列,我想按照其中的第1,第3,第8列排序怎么办?(看ipython的帮助文档)
df = pd.read_csv('filename') #dataFrame中排序的方法 df.sort_values(by='Count_AnimalName',ascending=False) #by='Count_AnimalName'按照某一列排序,ascending=False表示倒序 print(df) #查看所有 print(df.head(10))#查看前10个
pandas之取行或者取列
刚刚我们知道了如何给数据按照一行或者列排序,那么现在我们想单独研究使用次数前100的数据,应该如何做?
方括号里写行表示取行,对行进行操作
方括号里写字符串表示取列索引,对列进行操作
df['Count_AnimalName']表示取列
df[:100]表示取列
df[:100]['Count_AnimalName']表示既取行又取列
那么问题来了:我们要具体选择某一列该怎么选择呢?
df['Count_AmimalName']
我们同时选择行和列该怎么办:
df[:100]['Count_AmimalName']或df['Count_AmimalName'][:100]
二、pandas之loc
还有更多经过pandas优化过的选择方法:
1、df.loc 通过标签索引行数据
2、df.iloc 通过位置获取行数据,第几行获取(0,1,2,。。。)
t3 = pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('wxyz')) print(t3) ''' w x y z a 0 1 2 3 b 4 5 6 7 c 8 9 10 11 ''' # 通过索引获取数据 print(t3.loc['a','z']) #3 print(t3.loc['a']) ''' w 0 x 1 y 2 z 3 Name: a, dtype: int32 ''' print(t3.loc[:,'y']) ''' a 2 b 6 c 10 Name: y, dtype: int32 '''
取多行多列
t3 = pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('wxyz')) print(t3.loc[['a','c']]) ''' w x y z a 0 1 2 3 c 8 9 10 11 ''' print(t3.loc[['a','c'],['w','z']]) ''' w z a 0 3 c 8 11 ''' print(t3.loc['a':'c',['w','z']]) #'c'行数据会被选中,冒号在loc里面是闭合的,即会选择到冒号后面的数据 ''' w z a 0 3 b 4 7 c 8 11 '''
.iloc通过位置获取数据
# # 通过位置获取数据 t3 = pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('wxyz')) print(t3.iloc[1]) # 取第二行 # == print(t3.iloc[1,:]) ''' w 4 x 5 y 6 z 7 Name: b, dtype: int32 ''' print(t3.iloc[:,2]) #取所有行第三列 ''' a 2 b 6 c 10 Name: y, dtype: int32 ''' print(t3.iloc[:,[2,1]]) #取所有行的第三列和第二列 ''' y x a 2 1 b 6 5 c 10 9 ''' print(t3.iloc[[1,2],[2,1]]) #取第二行和第三行对应的第三列和第二列 ''' y x b 6 5 c 10 9 '''
赋值更改数据的过程,先取到某个值,再进行赋值
t3 = pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('wxyz')) t3.iloc[1:,:2] = 30 print(t3) ''' w x y z a 0 1 2 3 b 30 30 6 7 c 30 30 10 11 ''' t3.iloc[1:,:2] = np.nan #np.nan是float类型,在pandas中不需要转换数据类型 print(t3) ''' w x y z a 0.0 1.0 2 3 b NaN NaN 6 7 c NaN NaN 10 11 '''
三、pandas之布尔索引
回到之前狗的名字的问题上,假如我们想要找到所有的使用次数超过800的狗的名字,应该怎样选择?
df[df['Count_AnimalName']>800] 当有多个限制条件时 df[df[800<'Count_AnimalName']<1000] #这样写会报错,不能连续写 df[(800<df['Count_AnimalName'])&(df['Count_AnimalName']<1000]) df[(800<df['Count_AnimalName'])|(df['Count_AnimalName']<1000]) 两个问题: 1. &符号表示什么?哪有其他的连接符可以使用么? 2. str是什么方法? 注意点:不同条件之间需要用括号括起来,&且,|或
四、切割
df[df['info']].str.split('/').to_list() #.to_list()能够把Series转化为列表
缺失数据的处理
我们数据缺失通常有两种情况:
一种就是空,None等,在pandas中是NaN(和np.nan一样),另一种就是我们让其为0
对于NaN的数据,在numpy中我们是如何处理的?
在pandas中我们处理起来非常容易,判断数据是否为NaN:pd.isnull(df),pd.notnull(df)
处理方式1:删除NaN所在行列dropna(axis=0,how='any',inplace=False)
处理方式2:填充数据,t.fillna(t.mean()),t.fillna(t.median()),t.fillna(0)
处理为0的数据:t[t==0]=np.nan
当然并不是每次为0的数据都需要处理
计算平均值等情况,nan是不参与计算的,但是0会参与计算
t3 = pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('wxyz')) t3.iloc[1:,:2] = np.nan print(t3) # 判断是否为NaN print(pd.isnull(t3)) print(pd.notnull(t3)) print(t3[pd.notnull(t3['w'])]) # t3中'w'这列不为NaN的行 ''' w x y z a 0.0 1.0 2 3 ''' print(t3.dropna(axis=0)) #删除行中含有NaN的行 # == print(t3.dropna(axis=0,how='any')) #删除行中某列含有NaN的行 ''' w x y z a 0.0 1.0 2 3 ''' print(t3.dropna(axis=0,how='all')) # 删除行中所有列均含有NaN的行 ''' w x y z a 0.0 1.0 2 3 b NaN NaN 6 7 c NaN NaN 10 11 ''' print(t3.dropna(axis=0,how='any',inplace=True)) #inplace=True对原数据的就地修改,t3就替换为了删除后的数组 print(t3.fillna(100)) #之前的NaN替换为某个值 print(t3.fillna(t3.mean())) # 填充列的均值 ''' w x y z a 0.0 1.0 2 3 b 0.0 1.0 6 7 c 0.0 1.0 10 11 ''' # print(t3['w'].fillna(t3['w'].mean())) # 单纯填充某一列,有些字符替换没什么意义(比如电话号码) # t3['w'] = t3['w'].fillna(t3['w'].mean()) ''' a 0.0 b 0.0 c 0.0 Name: w, dtype: float64 '''
当某列数据中有NaN时,计算均值时不会将NaN计算在内,所以在爬数据的时候,没有取到值时最好不添加这个字段,或者放NaN,或者将设定的数值替换为NaN。
动手
对于一组电影数据,如果我们想rating,runtime的分布情况,应该如何呈现数据?
此代码调图花了很多时间 import pandas as pd from matplotlib import pyplot as plt file_path = '**.csv' df = pd.read_csv(file_path) # rating,runtime分布情况 #选择图形,直方图 #准备数据 runtime_data = df['Runtime(Minutes)'].values max_runtime = runtime_data.max() min_runtime = runtime_data.ming() #计算组数 num_bin = (max_runtime-min_runtime)//10 # 设置图形的大小 plt.figure(figure=(20,8),dpi=80) plt.hist(runtime_data,num_bin) print(list(range(max_runtime,min_runtime))) _x = [min_runtime] i = min_runtime while i <= max_runtime: i = i+0.5 _x.append(i) plt.xticks(_x) plt.show()
假设现在我们有一组从2006年到2016年1000部最流行的电影数据,我们想知道电影数据评分中的平均分,导演的人数等信息,应该怎么获取?
flatten是numpy.ndarray.flatten的一个函数,即返回一个一维数组。
flatten只能适用于numpy对象,即array或者mat,普通的list列表不适用!。
a.flatten():a是个数组,a.flatten()就是把a降到一维,默认是按行的方向降 。
a.flatten().A:a是个矩阵,降维后还是个矩阵,矩阵.A(等效于矩阵.getA())变成了数组。
import pandas as pd file_path = '**.csv' df = pd.read_csv(file_path) print(df.info) #看一下描述信息 print(df.head(1)) #看一下第一行数据 #获取平均评分 print(df['Rating'].mean()) # 导演的人数 print(len(set(df['Director'].tolist()))) print(len(df['Director'].unique())) # 获取演员的人数 temp_actors_list = df['Actors'].str.split(',').tolist() actors_list = [i for j in temp_actors_list for i in j] # == # actors_list = list(np.array(temp_actors_list).flatten()) actors_num = len(set(actors_list)) print(actors_num)
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-9-27 02:04
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社