当你经常在工作中拿到几十万或几百万行的中间数据结果,需要vlookup和数据透视,却发现Excel卡成狗还常常崩溃,找RD还被白眼时,你需要了解一下Pandas了。
人生苦短,我用python。Pandas是当前用于数据处理和分析中最流行的Python库。学会它能极大地简化日常对数据的处理操作。学会Pandas能减轻Excel带来的焦虑与脱发,配合jupyter notebook使用有奇效。
文中提到的具体数据和对应的jupyter notebook见文末。这里使用到的数据集是经典的泰坦尼克号人员名单数据集,可以替换成你实际的业务数据。
下面进入正题!
Pandas包括两大数据结构:Pandas DataFrame
Pandas Series
完全可以把Pandas DataFrame理解成一个Excel表格。包括行与列,差异在于一列中的数据类型需要保持一致。Pandas Series可以理解成Pandas DataFrame中的一列。
建议大家打开jupyter实际操作一下,把结果打印出来看一看。
安装Install
需要首先确保自己有安装好Pandas library。可以通过Anaconda或pip进行安装。然后就可以 import pandas as pd
如果我们的业务数据当中列特别多,那么我们在看output时,一些列会被折叠起来,不能全部显示。这里有个小tips,我们简单修改一下Pandas的参数设置就可以看完整了。
pd.set_option('display.max_columns', 500) 默认只展示50列,修改之后可以同时展示500列。
同理对行也有这样的需求的话: pd.set_option('display.max_rows',500)
导入数据
无论是CSV还是Excel文件都能轻松导入Pandas:导入CSV文件: pd.read_csv('train.csv')
导入Excel文件: pd.read_excel('train.xls')
可能的问题:要导入成功,需要保证对应的file在当前的目录下。可以在jupyter里通过!pwd查看当前的路径,!ls查看当前路径下的文件。
导入默认文件第一行为columns列名,如果文件中没有列名,需要指定pd.read_csv('train.csv',header = -1)
如果某一列为datetime类型,可以指定parse_dates=[column_name]来按照日期来进行解析。假设这样一列的列名为"Date",pd.read_excel("train.xls", parse_dates = ["Date"])
了解数据
1.DataFrame
df.head()获取dataframe的前5行。df.head(N)可以通过指定N值来获取任意行数。
df.tail()获取dataframe的后5行。
df.shape获取dataframe的行数与列数。
df.info()获取dataframe的索引值类型,列数据类型,填充情况和内存占用量。
df.describe()获取对dataframe的统计性数据。
2.columns
可以通过df["Age"].value_counts()获取对应值出现的频次,或者通过df["Age"].value_counts(1)来获取对应的占比。
df["Age"].isnull().sum()获取该列为空的数目。
df["Age"].notnull().sum()获取该列非空的数目。
df["Age"].unique()获取该列去重的数目。
df.columns获取所有的列名。
选择数据
1.通过列进行选择
df["Age"]选择对应这一列。 df[['PassengerId','Age','Survived']]选择对应这几列。
2.使用Index选择 主要使用.loc和.iloc。
df.loc[]使用rows和columns的名称来进行选择: df.loc[0:4,['PassengerId']]选择所有的行对应列为'Contour'的数据。:代表所有的行。需要指定对应的行时,可以写成df.loc[0:4,['PassengerId']]。
df.iloc使用对应位置的index来进行选择: df.iloc[:,3]选择所有行对应第三列的数据。 df.iloc[3,:]选择第三行所有列对应的数据。注意index从0开始。
3.过滤筛选
可以使用一个mask来帮助基于指定的条件进行筛选。
mask = df['Survived'] == 1
df[mask]
mask的值为True 或者False,表示是否符合对应的条件,即df['Survived'] == 1。df[mask]返回所有Contour列为Top的数据。
除了==的条件,还可以:
#值的范围:
mask2 = df['Age'] > 35
#是否在指定范围内
mask3 = df['Embarked'].isin(['S','C'])
筛选反向mask,可以写成df[~mask]
#筛选列的数据类型
df.select_dtypes(include=[np.number])
清洗数据
要做好数据分析,需要首先保证数据的质量。实际业务数据中或多或少存在一些问题,下面说一些实际中常用的数据清洗方法。注意指定inplace=True才能让改变在dataframe中实际执行。
1.替换错误的值 df.replace({'female': 'f','male':'m'}, inplace =True)
2.删除空的数据 df['Cabin'].dropna(inplace =True)
3.空值替换 df['Age'].fillna(df['Age'].mean(), inplace=True) #将空值替换为对应的平均值
4.删除行或列 df.drop(columns = ['Ticket'], inplace = True) df.drop(2, axis=0, inplace=True) axis=0指删除行,axis=1指删除列
5.更新列名 df.rename(columns = {'PassengerId' : 'PaId', 'Survived' : 'Surv'}, inplace = True)
6.更改数据 df['Fare'].apply(np.sqrt) 在列上指定某个操作使用.apply
数据分组和聚合
我们经常需要把数据按照某些维度聚合来观察另外一些列的分布情况。df.groupby(by=['Pclass'])['Fare'].mean()
df.groupby(by=['Pclass'])['Fare'].sum()
df.groupby(by=['Pclass'])['Fare'].count()
df.groupby(by=['Pclass', 'Surv'])['Fare'].mean()
DataFrame的合并
有时我们需要将dataframe按照一些规则合并在一起。按columns合并 pd.concat([df, df2], axis=1)
2. 按rows合并 pd.concat([df, df2], axis=0)
3. merge在一起,可以对应到Excel里的vlookup:
pd.merge(df, df2, left_on='PaId', right_on='PaId', how='outer') # how支持inner,outer,left,right
df与df2列重名儿的话,可以指定suffixes: pd.merge(df, df2,left_on='PaId', right_on='PaId', how='outer',suffixes=['_L', '_R'])
数据透视表
经典的Excel中的数据透视表功能,在Pandas中对应pivot_table:
df.pivot_table(index = 'Pclass', columns = 'Surv', values = 'Fare', aggfunc='mean')
输出结果
输出csv: df.to_csv('myDataFrame.csv', sep='\t') sep对应分隔符,默认的是","
输出excel:
writer = pd.ExcelWriter('myDataFrame.xlsx')
df.to_excel(writer, 'DataFrame')
writer.save()
数据和jupyter notebook
觉得有用的话关注我吧!
多谢多谢!