前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Python建立你数据科学的“肌肉记忆”

使用Python建立你数据科学的“肌肉记忆”

作者头像
AiTechYun
发布2018-12-04 10:14:47
2.9K0
发布2018-12-04 10:14:47
举报
文章被收录于专栏:ATYUN订阅号

编译:yxy

出品:ATYUN订阅号

你是否曾在在搜索语法时,因为打断了数据分析流而感到沮丧?为什么你在屡次查找后仍然不记得它?这是因为你还没有足够的练习来为它建立“肌肉记忆”。

现在,你可以想象一下,当你编写代码时,Python语法和函数会根据你的分析思路从指尖飞出。那画面是不是特别棒?这篇文章会帮助你实现这个目标。

我建议每天早上练习这个脚本10分钟,并重复一个星期。这和每天做一点点的仰卧起坐一样,只不过不是为了锻炼你的腹肌,而是为了锻炼你数据科学的“肌肉”。逐渐地,你会注意到重复训练后数据分析编程效率会有所提高。

在本文中,我们将练习最常用的数据预处理语法作为预热。

内容目录:

  1. 读取,查看和保存数据
  2. 表的维度和数据类型
  3. 基础的列操作
  4. 空值:查看,删除和替换(impute)
  5. 数据的去重

0.读取,查看和保存数据

首先,我们练习加载库:

代码语言:javascript
复制
# 1.Load libraries #
代码语言:javascript
复制
import pandas as pd
代码语言:javascript
复制
import numpy as np

现在我们将从我的GitHub存储库中读取数据。我从Zillow下载数据。

Zillow:https://www.zillow.com/research/data/#other-metrics

代码语言:javascript
复制
file_dir= "https://raw.githubusercontent.com/zhendata/Medium_Posts/master/City_Zhvi_1bedroom_2018_05.csv"
代码语言:javascript
复制
代码语言:javascript
复制
# read csv file into a Pandas dataframe
代码语言:javascript
复制
raw_df= pd.read_csv(file_dir)
代码语言:javascript
复制
代码语言:javascript
复制
# check first 5 rows of the file
代码语言:javascript
复制
# use raw_df.tail(5) to see last 5 rows of the file
代码语言:javascript
复制
raw_df.head(5)

结果如下:

保存文件是dataframe.to_csv()。如果您不想保存索引号码,请使用dataframe.to_csv(index = False)。

1.表的维度和数据类型

1.1维度

这个数据中有多少行和列?

代码语言:javascript
复制
raw_df.shape
代码语言:javascript
复制
# the results is a vector: (# of rows, # of cols)
代码语言:javascript
复制
代码语言:javascript
复制
# Get the number of rows
代码语言:javascript
复制
print(raw_df.shape[0])
代码语言:javascript
复制
# column is raw_df.shape[1]
1.2数据类型

数据的数据类型是什么,有多少列是数值类型?

代码语言:javascript
复制
# Check the data types of the entire table's columns
代码语言:javascript
复制
raw_df.dtypes
代码语言:javascript
复制
代码语言:javascript
复制
# Check the data type of a specific column
代码语言:javascript
复制
raw_df['RegionID'].dtypes
代码语言:javascript
复制
# result: dtype('int64')

输出前几列的数据类型:

如果想更加具体地了解数据,请使用select_dtypes()来列入或排除数据类型。问:如果我只想看2018的数据,该怎么做?

2.基础的列操作

2.1按列划分数据子集

按数据类型选择列:

代码语言:javascript
复制
# if you only want to include columns of float data
代码语言:javascript
复制
raw_df.select_dtypes(include=['float64'])
代码语言:javascript
复制
# Or to get numerical columns by excluding objects (non-numeric)
代码语言:javascript
复制
raw_df.select_dtypes(exclude=['object'])
代码语言:javascript
复制
代码语言:javascript
复制
# Get a list of all numerical column names #
代码语言:javascript
复制
num_cols= raw_df.select_dtypes(include=[np.number]).columns.tolist()

例如,如果你只想要float和integer列:

按名称选择和排除列:

代码语言:javascript
复制
# select a subset of columns by names
代码语言:javascript
复制
raw_df_info= raw_df[['RegionID','RegionName','State','Metro','CountyName']]
代码语言:javascript
复制
代码语言:javascript
复制
# drop columns by names
代码语言:javascript
复制
raw_df_sub= raw_df_info.drop(['RegionID','RegionName'],axis=1)
代码语言:javascript
复制
raw_df_sub.head(5)
2.2重命名列

如果我不喜欢列名,如何重命名?例如,将“State”更改为“state_”; ‘City’改为’city_’:

代码语言:javascript
复制
# Change column names #
代码语言:javascript
复制
raw_df_renamed1= raw_df.rename(columns= {'State':'state_','City':'city_})
代码语言:javascript
复制
代码语言:javascript
复制
# If you need to change a lot of columns: this is easy for you to map the old and new names
代码语言:javascript
复制
old_names= ['State','City']
代码语言:javascript
复制
new_names= ['state_','city_']
代码语言:javascript
复制
raw_df_renamed2= raw_df.rename(columns=dict(zip(old_names, new_names))

3.空值:查看,删除和替换

3.1有多少行和列有空值?
代码语言:javascript
复制
# 1. For each column, are there any NaN values?
代码语言:javascript
复制
raw_df.isnull().any()
代码语言:javascript
复制
代码语言:javascript
复制
# 2. For each column, how many rows are NaN?
代码语言:javascript
复制
raw_df.isnull().sum()
代码语言:javascript
复制
# the results for 1&2 are shown in the screenshot below this block
代码语言:javascript
复制
代码语言:javascript
复制
# 3. How many columns have NaNs?
代码语言:javascript
复制
raw_df.isnull().sum(axis=0).count()
代码语言:javascript
复制
# the result is 271.
代码语言:javascript
复制
# axis=0 is the default for operation across rows, so raw_df.isnull().sum().count() yields the same result
代码语言:javascript
复制
代码语言:javascript
复制
# 4. Similarly, how many rows have NaNs?
代码语言:javascript
复制
raw_df.isnull().sum(axis=1).count()
代码语言:javascript
复制
# the result is 1324

isnull.any()与isnull.sum()的输出:

isnull.any()

isnull.sum()

选择在一列中不为空的数据,例如,“Metro”不为空。

代码语言:javascript
复制
raw_df_metro= raw_df[pd.notnull(raw_df['Metro'])]
代码语言:javascript
复制
# If we want to take a look at what cities have null metros
代码语言:javascript
复制
raw_df[pd.isnull(raw_df['Metro'])].head(5)

Metro值为N/A的行

3.2为固定的一组列选择非空行

选择2000之后没有null的数据子集:

如果要在7月份选择数据,需要找到包含“-07”的列。要查看字符串是否包含子字符串,可以在string中使用substring,它将输出true或false。

代码语言:javascript
复制
# Drop NA rows based on a subset of columns: for example, drop the rows if it doesn't have 'State' and 'RegionName' info
代码语言:javascript
复制
df_regions= raw_df.dropna(subset= ['State','RegionName'])
代码语言:javascript
复制
代码语言:javascript
复制
# Get the columns with data available after 2000: use <string>.startwith("string") function #
代码语言:javascript
复制
cols_2000= [xfor xin raw_df.columns.tolist()if '2000-' in x]
代码语言:javascript
复制
raw_df.dropna(subset=cols_2000).head(5)
3.3 用空值对划分子集

选择我们希望拥有至少50个非NA值的行,但不限列:

代码语言:javascript
复制
# Drop the rows where at least one columns is NAs.
代码语言:javascript
复制
# Method 1:
代码语言:javascript
复制
raw_df.dropna()
代码语言:javascript
复制
#It's the same as df.dropna(axis='columns', how = 'all')
代码语言:javascript
复制
代码语言:javascript
复制
# Method 2:
代码语言:javascript
复制
raw_df[raw_df.notnull()]
代码语言:javascript
复制
代码语言:javascript
复制
# Only drop the rows if at least 50 columns are Nas
代码语言:javascript
复制
not_null_50_df= raw_df.dropna(axis='columns', thresh=50)
3.4删除和替换缺失值

填充或替换(impute)NA:

代码语言:javascript
复制
#fill with 0:
代码语言:javascript
复制
raw_df.fillna(0)
代码语言:javascript
复制
代码语言:javascript
复制
#fill NA with string 'missing':
代码语言:javascript
复制
raw_df['State'].fillna('missing')
代码语言:javascript
复制
代码语言:javascript
复制
#fill with mean or median:
代码语言:javascript
复制
raw_df['2018-01'].fillna((raw_df['2018-01'].mean()),inplace=True)
代码语言:javascript
复制
# inplace=True changes the original dataframe without assigning it to a column or dataframe
代码语言:javascript
复制
# it's the same as raw_df['2018-01']=raw_df['2018-01'].fillna((raw_df['2018-01'].mean()),inplace=False)

使用where函数按自己的条件填充:

代码语言:javascript
复制
# fill values with conditional assignment by using np.where
代码语言:javascript
复制
# syntax df['column_name'] = np.where(statement, A, B) #
代码语言:javascript
复制
# the value is A is the statement is True, otherwise it's B #
代码语言:javascript
复制
# axis = 'columns' is the same as axis =1, it's an action across the rows along the column
代码语言:javascript
复制
# axis = 'index' is the same as axis= 0;
代码语言:javascript
复制
raw_df['2018-02']= np.where(raw_df['2018-02'].notnull(), raw_df['2018-02'], raw_df['2017-02'].mean(), axis='columns')

4.数据的去重

在汇总或连接数据之前,我们需要确保没有重复的行。

我们想看看是否有任何重复的城市或地区。我们需要确定在分析中使用的唯一ID(city和region)。

代码语言:javascript
复制
# Check duplicates #
代码语言:javascript
复制
raw_df.duplicated()
代码语言:javascript
复制
# output True/False values for each column
代码语言:javascript
复制
代码语言:javascript
复制
raw_df.duplicated().sum()
代码语言:javascript
复制
# for raw_df it's 0, meaning there's no duplication
代码语言:javascript
复制
代码语言:javascript
复制
# Check if there's any duplicated values by column, output is True/False for each row
代码语言:javascript
复制
raw_df.duplicated('RegionName')
代码语言:javascript
复制
代码语言:javascript
复制
# Select the duplicated rows to see what they look like
代码语言:javascript
复制
# keep = False marks all duplicated values as True so it only leaves the duplicated rows
代码语言:javascript
复制
raw_df[raw_df['RegionName'].duplicated(keep=False)].sort_values('RegionName')

如果设定keep = False:

删除重复的值。

‘CountyName’和’SizeRank’组合已经是唯一的了。所以我们只使用列来演示drop_duplicated的语法。

代码语言:javascript
复制
# Drop duplicated rows #
代码语言:javascript
复制
# syntax: df.drop_duplicates(subset =[list of columns], keep = 'first', 'last', False)
代码语言:javascript
复制
unique_df= raw_df.drop_duplicates(subset= ['CountyName','SizeRank'], keep='first')

github:https://gist.github.com/zhendata/5d73068e5b31b616938af51bedf65382

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ATYUN订阅号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0.读取,查看和保存数据
  • 1.表的维度和数据类型
    • 1.1维度
      • 1.2数据类型
      • 2.基础的列操作
        • 2.1按列划分数据子集
          • 2.2重命名列
          • 3.空值:查看,删除和替换
            • 3.1有多少行和列有空值?
              • 3.2为固定的一组列选择非空行
                • 3.3 用空值对划分子集
                  • 3.4删除和替换缺失值
                  • 4.数据的去重
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档