datawhale-动手学数据分析task1笔记
动手学数据分析task1
第一节:数据载入及初步观察
载入数据
-
导入numpy库和pandas库。
import numpy as np import pandas as pd
-
载入数据。
-
相对路径载入数据。
# sep参数指定分隔符,默认是 , df = pd.read_csv('train.csv')
-
绝对路径载入数据。
path = os.path.abspath('train.csv') df = pd.read_csv(path)
-
相关注意与提示。
-
相对路径载入报错时,os.getcwd()查看当前工作目录。
-
read_csv得到了正确格式的数据,显示以","分割数据的格式。
-
read_table得到了原始格式数据,显示以制表符"\t"分割数据的格式。
-
read_table(path, sep=',')使用参数sep即可做到效果一致。
-
加载的数据是所有工作的第一步,我们的工作会接触到不同的数据格式(.csv;.tsv;.xlsx),但是加载的方法和思路都是一样的。
-
read_csv返回的是Dataframe或TextParser。
Dataframe.to_csv可将Dataframe转成csv文件。
-
-
-
逐块读取。
df = pd.read_csv('train.csv', chunksize=1000) # method1 for chunk in df: print(chunk) # method2 df.get_chunk()
逐块读取是将数据分成小块,并按块读取和处理。
逐块读取可以有效地处理大型数据,提高处理速度,减少内存使用,提高应对错误能力。chunker(数据块)的类型是TextFileReader。
for循环得到的数据不够美观。 -
将表头翻译成中文,索引为乘客ID。
# columns方法可以写成字典{'a':'A'} df.columns = ['乘客ID','是否幸存','乘客等级(1/2/3等舱位)','乘客姓名','性别','年龄','堂兄弟/妹个数','父母与小孩个数','船票信息','票价','客舱','登船港口'] # 增添表头method,用names参数,但原表头会变成数据。 df = pd.read_csv('train.csv', names=[...])
# 也可通过此方法利用dict完成翻译 df.rename(columns={dict}, inplace=True)
初步观察
-
查看数据基本信息。
print(df.info()) ''' <class 'pandas.core.frame.DataFrame'> RangeIndex: 891 entries, 0 to 890 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 乘客ID 891 non-null int64 1 是否幸存 891 non-null int64 2 乘客等级(1/2/3等舱位) 891 non-null int64 3 乘客姓名 891 non-null object 4 性别 891 non-null object 5 年龄 714 non-null float64 6 堂兄弟/妹个数 891 non-null int64 7 父母与小孩个数 891 non-null int64 8 船票信息 891 non-null object 9 票价 891 non-null float64 10 客舱 204 non-null object 11 登船港口 889 non-null object dtypes: float64(2), int64(5), object(5) memory usage: 83.7+ KB '''
print(df.describe()) ''' 乘客ID 是否幸存 ... 父母与小孩个数 票价 count 891.000000 891.000000 ... 891.000000 891.000000 mean 446.000000 0.383838 ... 0.381594 32.204208 std 257.353842 0.486592 ... 0.806057 49.693429 min 1.000000 0.000000 ... 0.000000 0.000000 25% 223.500000 0.000000 ... 0.000000 7.910400 50% 446.000000 0.000000 ... 0.000000 14.454200 75% 668.500000 1.000000 ... 0.000000 31.000000 max 891.000000 1.000000 ... 6.000000 512.329200 '''
-
观察表格前10行的数据和后15行的数据。
# head()和tail()的参数是显示的数量 df.head(10) df.tail(15)
-
判断数据是否为空,为空的地方返回True,其余地方返回False。
df.isnull()
保存数据
保存并重命名。
df.to_csv('train_chinese.csv')
第二节 pandas基础
了解数据类型
-
Series是带标签的一维数组,轴标签统称为索引。
-
Series使用示例,可以使用index参数,也可以使用字典。
>>> s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e']) >>> s ''' 输出: a -0.108730 b -0.412877 c -0.307803 d -0.728362 e -0.679069 dtype: float64 '''
>>> sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000} >>> example_1 = pd.Series(sdata) >>>example_1 ''' 输出: Ohio 35000 Texas 71000 Oregon 16000 Utah 5000 dtype: int64 '''
-
DataFrame 是由多种类型的列构成的二维标签数据结构,类似于 Excel 、SQL 表,或 Series 对象构成的字典。
-
DataFrame使用示例。
>>> d = {'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']),'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])} >>> df = pd.DataFrame(d) >>> d ''' 输出: one two a 1.0 1.0 b 2.0 2.0 c 3.0 3.0 d NaN 4.0 '''
>>> data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],'year': [2000, 2001, 2002, 2001, 2002, 2003],'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]} >>> example_2 = pd.DataFrame(data) >>> example_2 ''' 输出: state year pop 0 Ohio 2000 1.5 1 Ohio 2001 1.7 2 Ohio 2002 3.6 3 Nevada 2001 2.4 4 Nevada 2002 2.9 5 Nevada 2003 3.2 '''
-
columns方法可以得到表头的list。
-
查看某一列的所有项可以直接
df.xxx
或利用索引df['xxx']
,注意得到的是Series类型,如果想返回DataFrame可以使用嵌套df[['xxx']]
。 -
删除列可以使用
del
、df.pop('xxx')
、df.drop(['xxx'] ,axis=1 ,inplace=True)
(默认inplace参数是False,结果是生成一个副本,而非本身发生变化,只有True才能改变本身)。
筛选的逻辑
-
可直接通过索引比较数据大小,或者通过list的索引获得符合条件的数据序号。
>>> df['Age'] < 10 ''' 输出: 0 False 1 False 2 False 3 False 4 False ... 886 False 887 False 888 False 889 False 890 False Name: Age, Length: 891, dtype: bool ''' >>> df[df['Age'] < 10] '''结果繁琐省略''' # 交集是& 并集是| >>> midage = df[(df['Age'] < 50) & (df['Age'] > 10)] '''结果繁琐省略'''
-
如果需要用选择某行的某些数据,可以使用
.loc[[序号行], [column]]
方法>>> midage.loc[[100], ['Name','Pclass', 'Sex']] ''' 输出: Name Pclass Sex 100 Petranec, Miss. Matilda 3 female '''
注意:上面获得的第100行并不是midage中的一百行,而是原数据编号为100的行。
-
如果需要获得部分数据新创建的dataframe中的特定行数,需要使用
.reset_index()
方法,但其原索引会变成一列新的内容,如果需要覆盖原索引,可以增加参数drop=True
。 -
注意一般默认索引开始是0。
-
iloc[]
和loc[]
最大的不同是iloc[]
方法是基于整数位置(真实的索引,而非认为标注的)索引,而.loc[]
是基于标签的,而不是基于整数位置的。
探索性数据分析
-
DaraFrame数据按columns(列)排序可以使用
.sort_values()
方法,其中参数ascending=True
是默认升序排列,axis=0
是默认按行排序。 -
排序index和columns可以使用
.sort_index()
方法,其中参数ascending=True
是默认升序排列,axis=0
是排序indx,axis=1
是排序columns。 -
如果同时对两个数据进行排序时,无法做到,会优先满足第一个数据(作为参数的)。
-
利用Pandas进行算术计算,计算两个DataFrame数据相加时,只有行列都相同的部分才会进行算术计算,剩下的会数据NaN。
-
一个DataFrame的不同columns计算就是普通计算。