主要为记录pandas日常使用的一些函数,仅作为备忘录,不提供总结和见解。
DataFrame 和 Series
pandas的两个核心对象: DataFrame 和 Series.
DataFrame是一个表,带有独立条目,每个条目都有相对应的值,每个条目都对应到一行或者一列,最常见的语法是用一个字典来初始化一个DataFrame。
import pandas as pd
pd.DataFrame({'Yes': [50, 21], 'No': [131, 2]})
pd.DataFrame({'Bob': ['I liked it.', 'It was awful.'], 'Sue': ['Pretty good.', 'Bland.']}) # DataFrame 条目的值也可以是字符串
如果想要指定行的名称,则需要通过index
参数:
pd.DataFrame({'Bob': ['I liked it.', 'It was awful.'],
'Sue': ['Pretty good.', 'Bland.']},
index=['Product A', 'Product B'])
Series 是DataFrame的一单独列,同时可被认为是一列表,可通过一列表来初始化,
pd.Series([1, 2, 3, 4, 5])
pd.Series([30, 35, 40], index=['2015 Sales', '2016 Sales', '2017 Sales'], name='Product A') # 可以指定index
打开一个csv文件,
wine_reviews = pd.read_csv("./winemag-data-130k-v2.csv")
wine_reviews.shape # 可以得到 DataFrame 的形状
wine_reviews= pd.read_csv("../input/wine-reviews/winemag-data-130k-v2.csv", index_col=0) # 可以在读取文件的时候指定列的名称
索引和切片
import pandas as pd
reviews = pd.read_csv("../input/wine-reviews/winemag-data-130k-v2.csv", index_col=0)
pd.set_option('max_rows', 5)
reviews.country # 可以通过.操作符来查看表格的某一属性
reviews['country'] # 也可以通过字典索引的方式
reviews['country'][0] # 查看country的第一行
除了这种基于python原生的方式,pandas提供了自己的方法来进行索引,loc
和iloc
,它们都是行第一,列第二的一类方法,使用iloc方法的时候通常将 DataFrame 视为一个数值矩阵,而loc更关注数据本身的内在结构,可以通过索引混合字典关键字的方式进行索引,
reviews.iloc[0] # 查看 DataFrame 的第一行
reviews.iloc[:, 0] # 查看 DataFrame 的第一列,: 代表所有行
reviews.iloc[1:3, 0] # 查看 DataFrame 的第一列的第2,3行
reviews.iloc[[0, 1, 2], 0] # 查看 DataFrame 的第一列的第1,2,3行,负数也可以用来索引
reviews.loc[0, 'country'] # 得到第一行的'country'对应的值
需要注意的是loc
和iloc
在索引上的一点小区别,iloc
方法不包括最后一个索引,而loc
方法包括最后一个索引,df.iloc[0:1000] 返回 1000 个值,df.loc[0:1000] 返回 1001 个值。
条件选取:
reviews.country == 'Italy' # 查看当前数据的country属性是否为 Italy
reviews.loc[reviews.country == 'Italy'] # 选出满足条件的所有数据
reviews.loc[(reviews.country == 'Italy') & (reviews.points >= 90)] # 索引中支持逻辑运算
reviews.loc[reviews.country.isin(['Italy', 'France'])] # country的值在后续所给定的列表中即可
reviews.loc[reviews.price.notnull()] # isnull 和 notnull 方法筛选出那些对应字段为NaN或者不为NaN的数据
一些统计函数
import pandas as pd
pd.set_option('max_rows', 5)
import numpy as np
reviews = pd.read_csv("../input/wine-reviews/winemag-data-130k-v2.csv", index_col=0)
reviews.points.describe() # describe()方法返回的是对所给列的一个高等级的总结,主要包括一些统计信息,其输出类型由输入类型决定
reviews.points.mean() # 也可以自己显式调用方法提取相应的统计信息
reviews.taster_name.unique() # 删除重复信息
reviews.taster_name.value_counts() # 数据出现了多少次
创建数据的新表示,简单的如数据的归一化
review_points_mean = reviews.points.mean()
reviews.points.map(lambda p: p - review_points_mean)
map()
返回了一个新的 Series ,其中所有的值都发生了变换. apply()
是一种等价方式,可对 DataFrame 的每一行进行操作. map()和apply()不会对原数据做修改
def remean_points(row):
row.points = row.points - review_points_mean
return row
reviews.apply(remean_points, axis='columns') # 指定索引名称的话,就会改变对应的列
将数据分组
import pandas as pd
reviews = pd.read_csv("../input/wine-reviews/winemag-data-130k-v2.csv", index_col=0)
pd.set_option("display.max_rows", 5)
reviews.groupby('points').points.count() # 将数据按照points条目进行分组,也就是给出相同分数的数据聚合在一起,然后按照每个分数的数目进行输出
reviews.groupby(['country']).price.agg([len, min, max]) # agg方法,允许同时给出好几类不同的统计函数
countries_reviewed = countries_reviewed.reset_index()
countries_reviewed.sort_values(by='len') # 允许最后输出的时候按照值进行排序,而不是索引,默认是一个升序排列
countries_reviewed.sort_values(by=['country', 'len']) # 在有序列表的基础上进行二次排序
数据类型和缺失值处理
import pandas as pd
pd.set_option('max_rows', 5)
reviews = pd.read_csv("../input/wine-reviews/winemag-data-130k-v2.csv", index_col=0)
reviews.price.dtype # 返回数据的数值类型
reviews.dtypes # 返回每一列数据的类型
reviews.points.astype('float64') # 数据类型转换
reviews.region_2.fillna("Unknown") # 用给定值去代替NaN值
reviews.taster_twitter_handle.replace("@kerinokeefe", "@kerino") # 替换方法
重命名
import pandas as pd
pd.set_option('max_rows', 5)
reviews = pd.read_csv("../input/wine-reviews/winemag-data-130k-v2.csv", index_col=0)
reviews.rename(columns={'points' : 'score'}) # 改变索引的名称,或者说列的名称;支持多种数据格式,但字典是最方便的类型
reviews.rename(index={0: 'firstEntry', 1: 'secondEntry'}) # 改变第一行和第二行的名称
组合数据的方法
df1 = pd.read_csv("../input/youtube-new/CAvideos.csv")
df2= pd.read_csv("../input/youtube-new/GBvideos.csv")
df = pd.concat([df1, df2]) # 拼接两个 DataFrame