python pandas cookbook

pandas快速上手知识点

Posted by Kylin on February 15, 2023

python.pandas cookbook

  • DataFrame
// from a list of dictionaries, created row by row
list_of_dicts = [
    {
    	"name":"A",
    	"weight":56
    },{
      "name":"B",
    	"weight":48
    }
]
pd.DataFrame(list_of_dicts)

// from a dictionaries of lists, created col by col
dict_of_lists={
	"name":["A","B"],
	"weight":[56,48]
}
pd.DataFrame(dict_of_lists)


// from .csv file
df = pd.read_csv("file_path")
// to .csv file
df.to_csv("store_file.csv")
  • 快速数据预览
// 预览前10行
dataframe.head()

// 列名、缺失值、类型
dataframe.info()

// 返回缺失值、非缺失值的bool table
dataframe.isnull()
dataframe.notnull()
// 统计各列缺失值
dataframe.isnull().sum()
dataframe.notnull().sum()

// 查看列类型
dataframe.dtypes

// 数据形状
datafrmae.shape

// 算均值方差
dataframe.describe()

// 转二维度numpy array
dataframe.values
  • sorting and subsetting
// 升序
dataframe.sort_values("column_name")

// 降序
dataframe.sort_values("column_name",ascending=False)

// 多个变量排序,多种方向
dataframe.sort_values(["column-name1","column-name2"],ascending=[True,False])
  • 行、列选
// loc标签选
df.loc[row_labels, column_labels]
// 只行选
df.loc[[row_labels1,row_labels2]]

// iloc索引选
df.loc[row_labels, column_labels]

// 筛选int类型的列
df.select_dtypes(include=['int'])
// 列索引
dataframe.columns

// 行索引
dataframe.index

// 列选
dataframe["column_name"]

// 多列选
dataframe[["column_name1","column_name2"]]

// 输出条件boolean的dataframe
dataframe['height']>180

// 嵌套条件筛选目标值
dataframe[dataframe['height']>180]
dataframe[dataframe['name']=="ketty"]
dataframe[dataframe['birth_date']<"2015-01-01"]    // pandas可以识别国际标准日期

// 多条件筛选
is_xxx = dataframe["A"]=="xxx"
is_xxxx = dataframe["B"]=="xxxx"
dataframe[is_xxx & is_xxxx]
dataframe[(dataframe["A"]=="xxx") & (dataframe["B"]=="xxxx")] //一行得加括号

// 过滤分类变量的多个值
condition=dataframe["color"].isin(["black","Brown"])
dataframe[condition]
  • 新列派生 (mutating a DataFrame, transforming a DataFrame, and feature engineering)
// 直接计算指定(指定即创建)
dataframe['bmi']=dataframe['weight']/dogs['dataframe']**2
  • Summarizing 和 aggregate
// axis是“index”代表在index维度上做聚合(计算)
// 注意,这些计算默认会排除缺失值

dataframe['column_name'].mean(axis="index")

.median(axis="columns") , .mode()
.min() , .max()
.var() , .std()
.sum() ,
.quantile(percentage)  //percentage指定了分位数的比例,比如0.25,代表下四分位数;0.5代表中位数
.cumsum()   //累计和,第i个索引计算之前的数据和
.cummax() , .cummin() , .cumprod()
// 数据聚合 dataframe.agg([func1,func2])
def pct30(column):
	return column.quantile(0.3)
	
def pct40(column):
	return column.quantile(0.4)
	
dataframe[['a','b']].agg([pct30,pct40,np.median])
  • Counting
// 某一列去重
dataframe.drop_duplicates(subset="column_name_1")

// 多列去重(逻辑:只有两列均重复才会去除)
dataframe.drop_duplicates(subset=["column_name_1","column_name_2"])

// 统计某一列各个值出现的数量(并排序,默认sort=False)
dataframe['column_name'].value_counts(sort=True)

// 统计某一列各个值出现的比例
dataframe['column_name'].value_counts(normalize=True)
  • Group
// naive group
dataframe[dataframe['type']=='a']['value'].mean()
dataframe[dataframe['type']=='b']['value'].mean()
dataframe[dataframe['type']=='c']['value'].mean()
...

// advanced 
dataframe.groupby("type")["value"].mean()
dataframe.groupby("type").agg([min,max,sum])
//多列汇总统计信息
dataframe.groupby(["type1","type1"])["value"].mean()
dataframe.groupby(["type1","type1"])[["value1","value2"]].mean()
  • Pivot tables (数据透视表)
// 默认情况下,pivot table采用分组平均值.意思是,统计class_column_name中出现的几种类别在agg_column_name下的统计平均值
dataframe.pivot_table(values="agg_column_name",index="class_column_name")

// 指定metrics
dataframe.pivot_table(values="agg_column_name",index="class_column_name", aggfunc=np.median)

// 多个metrics
dataframe.pivot_table(values="agg_column_name",index="class_column_name", aggfunc=[np.median,np.mean])

// 矩阵表达两个index
dataframe.groupby(["color","breed"])["weight"].mean()
// 若是没有的分类填充缺失值为NaN
dataframe.pivot_table(values="weight",index="color",columns="breed")
// 若是没有的分类填充缺失值为0
dataframe.pivot_table(values="weight",index="color",columns="breed",fill_value=0)
// 计算边缘平均值(不算上fill的值)
dataframe.pivot_table(values="weight",index="color",columns="breed",fill_value=0,margins=True)
  • Explicit indexes

索引不需要是唯一的

// 设置一个列为索引,这之后,每一行的索引就不是1,2... ,而是name了
dataframe_index=dataframe.set_index("name")
// 取消索引,将索引放回列
dataframe_index.reset_index()
// 取消索引, 将索引丢弃
dataframe_index.reset_index(drop=True)

//设置多索引,但是索引是嵌套的,color嵌套子啊name里,这样聚合外部索引,内部会继续分类
dataframe_index=dataframe.set_index(["name","color"])
//多索引loc
dataframe.loc[[('name1','color1'),('name2','color2')]]

// index排序,默认单索引升序
dataframe.sort_inedx()
dataframe,sort_inedx(level=["name","color"],ascending=[True,False])
  • Slicing
// 对dataframe切片之前,首先要对索引进行排序
dogs_srt = dogs.set_index(['breed','color']).sort_index()

// 一级索引切片。注意,索引包含end_index
dogs_srt.loc['start_index':'end_index']

// 二级索引切片。注意,索引包含end_index
dogs_srt.loc[('start_index_1_class','start_index_2_class'):('end_index_1_class','end_index_2_class')]

// 列切片
dogs_srt.loc[:,"name":"height_cm"]

// 按序号切片。注意,结果不包含最终值
dogs.loc[2:5,1:4]
  • pandas的日期访问
//You can access the components of a date (year, month and day) using code of dataframe["column"].dt.component

dataframe["column"].dt.month
  • Visualization (可视化)
// Histogram
import matplotlib.pyplot as plt
dataframe["column_name"].hist(bins=20)   //bins代表条形图的条数
plt.show()

// Bar
dataframe.groupby("column_name")["weight"].mean().plot(kind="bar",title="title_name")
plt.show()

// line Plot
//////////////////// 
& \text { date } & \text { weight_kg } \\
0 & 2019-01-31 & 36.1 \\
1 & 2019-02-28 & 35.3 \\
2 & 2019-03-31 & 32.0 \\
3 & 2019-04-30 & 32.9 \\
4 & 2019-05-31 & 32.0
////////////////// rot是x轴标尺的旋转角度
dataframe.plot(x="date",y="weight_kg",kind="line",rot=45)   
plt.show()

// Scatter Plot
dataframe.plot(x="height",y="weight",kind="scatter") 

// Layering Plot
dataframe[dataframe["class"]=="A"]["weight"].hist(alpha=0.7)
dataframe[dataframe["class"]=="B"]["weight"].hist(alpha=0.7)
plt.legend(["A","B"])
plt.show()
  • Missing values
//返回一个table指示每一个空是否是缺失值
dataframe.isna()

//返回一个与columns等长向量,指示每一列是否有缺失值
datframe.isna().any()

//返回一个与columns等长向量,指示每一列有多少缺失值
dataframe.isna().sum()
dataframe.isna().sum().plot(kind="bar")

//丢去缺失数据等行
dataframe.dropna()

// 删除有缺失值的列
dataframe.dropna(axis=1)

//用0替代missing values
dataframe.fillna(0)