Skip to content

Pandas

pandas documentation — pandas 1.2.4 documentation (pydata.org)

Pandas 教程 - 盖若 (gairuo.com)

数据处理:

  • 分箱
  • pd.cut()
  • pd.qcut()
  • 离散数值
  • pd.get_dummies()

DataFrame

Dataframe 中 str 类型是 object

创建 DataFrame

pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=None)
#  数据  索引(行标签) 列标签  数据类型  拷贝数据  

用字典创建

data={"one":np.random.randn(4),"two":np.linspace(1,4,4),"three":['zhangsan','李四',999,0.1]}
df=pd.DataFrame(data,index=[1,2,3,4])

用数组创建

data=np.random.randn(6,4)#创建一个6行4列的数组
df=pd.DataFrame(data,columns=list('ABCD'),index=[1,2,'a','b','2006-10-1','第六行'])

空 DataFrame

pd.DataFrame(columns=('id','name','grade','class'))

索引设置

创建 df 是不指定索引默认会从 0 开始

set_index:将 df 中的某列设置为索引

df.set_index('one',drop=False) # drop默认为True, 表示设置索引后将该列删除

reset_index:重置索引

df.set_index(drop=True) # drop默认为False, 表示原索引将作为数据保留

读取 DataFrame

行名与列名不一定是字符串,也可以是 int

按列读取

# 按列名, 这里的列名不一定都是 str
f.列名   # 返回 Series
df['列名']  # 返回 series
df[['列名']] / df[['列名1', '列名2',...]]  # 返回 Dataframe Dataframe

# 按列号 iloc
df.iloc[:,0:2]  # [0,2)列 返回 Dataframe

按行读取

# 按行标签 loc, 这里行标签不一定是字符串
df.loc['行标签'] / df.loc[['行标签']] / df.loc[['行标签1','行标签2',...]]  # series Dataframe Dataframe

# 按行号 iloc
df.iloc[行号] / df.iloc[[行号]] / df.iloc[[行号1,行号2,...]] / df.iloc[行号1:行号2]# 第一个是series 后面的是Dataframe 

按单元格读取

df[col][row] # eg: df['a'][1] df[1][2]

/* loc */
# 一个单元格, float or str 
df.loc[row][col] / df.loc[row, col]

# 一行多列, Series
df.loc[row][[col1,col2]] / df.loc[1,[col1,col2]] / df.loc[row][firstCol:endCol] / df.loc[row,firstCol:endCol]

# 多行一列 行号不能用切片
df.loc[[row1,row2]][col] / df.loc[[row1,row2]].col / df.loc[[row1,row2],col]

# 多行多列 行号不能用切片
df.loc[[row1,row2],[col1,col2]] / df.loc[[row1,row2]][[col1,col2]] / df.loc[[row1,row3],firstCol:endCol]

/* iloc */ 
# 一个单元格 不支持df.iloc[rowNo,col]
df.iloc[rowNo].col / df.iloc[rowNo][col] / df.iloc[rowNo,colNo] 

# 一行多列 不支持df.iloc[rowNo,[col1,col2]],df.iloc[rowNo,firstColNo:endColNo]
df.iloc[rowNo,firestColNo:endColNo] / df.iloc[rowNo][[col1,col2]] / df.iloc[rowNo][firesCol:endCol]

# 多行一列
df.iloc[[rowNo1,rowNo2],colNo] / df.iloc[firstRowNo:endRowNo,colNo] / df.iloc[[rowNo1,rowNo2]][col] / df.iloc[firstRowNo:endRowNo][col]

# 多行多列
df.iloc[firstRowNo:endRowNo,firstColNo:endColNo] / df.iloc[[RowNo1,RowNo2],[ColNo1,ColNo2]] / df.iloc[firstRowNo:endRowNo][[col1,col2]]

按条件读取

复杂的判断条件需要用到 |&,而且每项都要用 ()

df = df[df['NR']==1]
# 改变满足特定的行的某列的值
df.loc[df["NA"]==1, "IsNa"] = 1

赋值,替换

如果用一个列表或数组赋值,其长度必须相同

Dataframe.fillna()

按列赋值

df.col=colList/colValue  
df[col]=colList/colValue
# eg: df.A=[1,2,3,4,5,6],df['A']=0

按行赋值

df.loc[row]=rowList 
df.loc[row]=rowValue

多行多列赋值

df.loc[[row1,row2],[col1,col2]]=value/valueList
df.iloc[[rowNo1,rowNo2],[colNo1,colNo2]]=value/valueList
df.iloc[[rowNo1,rowNo2]][[col1,col2]]=value/valueList

其他

df[df == 'NR'] = 0   # 所有 NR 替换成 0
DataFrame.fillna()

增加数据

按列增加

df.insert()
df.insert(loc, column, value)
  • loc:插入列位置,int
  • column:列名
  • value:插入值,int,Series,or array-like

按行增加

df.loc()
df.loc['新行标签']=values  # 新行标签不一定要是 str
# eg
df.loc[len(df)+1]=values 
df.append()

index 可以有相同的

columns 可以不同,columns 会取并集,缺失的地方补 nan

df1 = df1.append(df2)
df.concat()
pandas.concat(objs, axis=0, join='outer', ignore_index=False)
  • axis:拼接的维度
  • join:连接方式,{'inner', 'outer'},defalut:outer
  • ignore_index:True 将会重新排列,0...N-1,default:False

删除数据

Dataframe.drop()

DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')

Dataframe.dropna()

DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

Remove missing values

  • subset (column label or sequence of labels,optional):Labels along other axis to consider, e.g. if you are dropping rows these would be a list of columns to include.

作图

Dataframe.plot()

DataFrame.plot(*args, **kwargs)

args:

  • kind (str):可选 "scatter" ...
  • x:label
  • y:label
  • figsize:
  • cmap
  • colorbar

hands on ml 中的例子

# 房价例子,横纵坐标表示经纬度,s 用人口表示大小,c 用房价来代表颜色,具体可以看 pyplot.scatter
housing.plot(kind="scatter", x="longitude", y="latitude", alpha=0.4,
       s=housing["population"]/100, label="population", figsize=(10,7),
       c="median_house_value", cmap=plt.get_cmap("jet"), colorbar=True,
   )
plt.legend()

Dataframe.hist()

会调用 matplotlib.pyplot.hist()

DataFrame.hist(column=None, by=None, grid=True, xlabelsize=None, xrot=None, ylabelsize=None, yrot=None, ax=None, sharex=False, sharey=False, figsize=None, layout=None, bins=10, backend=None, legend=False, **kwargs)

groupby

crosstab 交叉列表取值

Pandas.plotting

plotting.scatter_matrix()

plotting.scatter_matrix(frame, alpha=0.5, figsize=None, ax=None, grid=False, diagonal='hist', marker='.', density_kwds=None, hist_kwds=None, range_padding=0.05, **kwargs)

Draw a matrix of scatter plots,画矩阵散点图

一些例子

取出数值类

# str 类的 dtype 是 'object'
numeric_features = all_features.dtypes[all_features.dtypes != 'object'].index
all_features[numeric_features]

对每列数据标准化

df_normal = df.apply(lambda x: (x-x.mean()) / (x.std()))

填补缺失值

import pandas as pd
data = pd.read_csv(r"path.csv",index_col=0)
data.head()
data.loc[:,"Age"] = data.loc[:,"Age"].fillna(data.loc[:,"Age"].median())
#.fillna 在DataFrame里面直接进行填补
data.dropna(axis=0,inplace=True)
#.dropna(axis=0)删除所有有缺失值的行,.dropna(axis=1)删除所有有缺失值的列
#参数inplace,为True表示在原数据集中修改, False会返回一个副本,默认 False

参考

pandas 入门:DataFrame的创建,读写,插入和删除_不去想结果,一直在路上-CSDN博客

详解pandas的read_csv方法 - 古明地盆 - 博客园