Pandas¶
pandas documentation — pandas 1.2.4 documentation (pydata.org)
数据处理:
- 分箱
- 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