pandas常用

  1. Series相关
  2. DataFrame的一些
  3. apply, map, group一些很好用的操作
  4. DataFrame画图
  5. 找出含有空值的行
  6. sheet读取/写入操作
  7. 追加写入
  8. read_csv所有参数解释

1. Series相关

Series.var()#求方差
Series.mean()#求均值

#创建一个准备填充Age列的 高斯分布的 Series
##注意df.fillna()不能是numpy数组
pd.Series(np.random.normal(df.loc[:, 'Age'].var(), df.loc[:, 'Age'].mean(), df.loc[:, 'Age'].isnull().sum()), index=df[df.loc[:, "Age"].isnull()].index)

2.DataFrame的一些

df['Embarked'].fillna(df['Embarked'].value_counts().idxmax())#众数填充

df.mode()#获得众数

df = pd.get_dummies(df, columns=["Embarked"], prefix="Embarked")#哑变量转换

df.isnull.sum()#计数空值

df.dropna(inplace=True)#丢弃含有nan的行

#丢弃列
df.drop(['Name', 'Ticket', 'Cabin'], axis=1, inplace=True)#inplace

#根据数据类型筛选数据
df.select_dtypes(include='bool')#还能用exclude

3. apply, map, group一些很好用的操作

一文详解pandas中的map、apply、applymap、groupby、agg...

apply好用


4. DataFrame画图

画图

df.plot(*x=None, y=None, kind='line', ax=None, subplots=False, sharex=None, sharey=False, layout=None, figsize=None, use_index=True, title=None, grid=None, legend=True, style=None, logx=False, logy=False, loglog=False, xticks=None, yticks=None, xlim=None, ylim=None, rot=None, fontsize=None, colormap=None, table=False, yerr=None, xerr=None, secondary_y=False, sort_columns=False, *kwds)

  1. 对于一个DataFrame对象df,直接在一个ax中画出所有列的图--->用df.plot();
  2. 将不同的列画在不同的ax中--->利用参数subplots和layout,即令subplots=True,然后再设置layout,传给其参数形式是一个元组,代表axes的布局,例如(3,2)表示3行2列的布局;如果不设置,则默认按一列的布局,还可以设置sharex=True,使其不同的subplot共享同一个x轴,可以节省画布空间,视觉效果也会更好;
  3. 画多个子图,但是并不是每列分别占一个ax,而是一个子图(ax)中画多列--->可以通过其中的ax参数,当然这时就需要用到matplotlib包,先创建特定布局的figure,然后再把这个figure中的axes对象传给参数ax,以画在这个特定的ax上,例如fig,axes=pmatplotlib.pyplot.subplots(3,2,figsize=(12,9)),这条语句创建了figure对象fig,还有ax对象组成的adarray--axes,然后通过例如df.plot(ax=axes[0,1])这样的语句把df的多列画在fig画布的第一行第二列的ax对象上。
fig, axes = plt.subplots(2, 1, figsize=figsize)

history[['loss', 'val_loss']].plot(subplots=True, ax=[axes[0], axes[0]], sharex=True)
axes[0].set_ylim((history[['loss', 'val_loss']].values.min(), 
                  history[['loss', 'val_loss']].values.max()))
axes[0].grid()

history[['acc', 'val_acc']].plot(subplots=True, ax=[axes[1], axes[1]], sharex=True)
axes[1].set_ylim((history[['acc', 'val_acc']].values.min()-0.1, 
                  history[['acc', 'val_acc']].values.max()+0.1))
axes[1].grid()

5. 找出含有空值的行

** DataFrame[DataFrame.isnull().T.any()]**

非转置:frame3.isnull().any(),得到的每一列求any()计算的结果,输出为列的Series。

转置:frame3.isnull().T.any(),得到的每一行求any()计算的结果,输出为行的Series。


6. sheet读取/写入操作

读取

#sheet_name:None代表读取所有的sheet,返回的就是一个ordereddict;指定就只读取指定sheet,只有一个返回的就是dataframe

# 整型数字:目标sheet所在位置,以0开始,比如sheet_name = 0代表第1个工作表
data = pd.read_excel(path, sheet_name = 1)

# 工作表名:目标sheet的名称,可用中英文
data = pd.read_excel(path, sheet_name = 'the sheet')

# SheetN:表示第N个sheet,S必须大写,注意与整型数字的区别使用
data = pd.read_excel(path, sheet_name = 'Sheet5')

# sheet_name 默认为0,取Excel第一个工作表。如果读取多个工作表,则显示表格的字典
data = pd.read_excel(path, sheet_name = [1, 'the sheet', 'Sheet3'], nrows = 5)

所有sheet的name可以这么获得

sheet_names = pd.ExcelFile('./data/meal_order_detail.xlsx').sheet_names

写入

#利用Pandas包中的ExcelWriter()方法增加一个公共句柄,在写入新的数据之时保留原来写入的数据,等到把所有的数据都写进去之后关闭这个句柄

writer = pd.ExcelWriter('example.xlsx')
A = np.array([[1,2,3],[4,5,6]])
B = np.array([[10, 20, 30], [40, 50, 60]])

df1 = pd.DataFrame(A)
df2 = pd.DataFrame(B)
df1.to_excel(writer,sheet_name='AAA')
df2.to_excel(writer,sheet_name='BBB')
writer.save()
writer.close()

7. 追加写入

方法一

行列都可

writer = pd.ExcelWriter(filepath)
df.to_excel(excel_writer=writer,startcol=9)
df1.to_excel(excel_writer=writer,startrow=8)

方法二

只有列方向

df.to_csv(file_name, mode='a')

8. read_csv主要参数解释(用到了就更新)

pandas.read_csv(filepath_or_buffer: Union[str, pathlib.Path, IO[~AnyStr]], sep=',', delimiter=None, header='infer', names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, skipfooter=0, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, cache_dates=True, iterator=False, chunksize=None, compression='infer', thousands=None, decimal: str = '.', lineterminator=None, quotechar='"', quoting=0, doublequote=True, escapechar=None, comment=None, encoding=None, dialect=None, error_bad_lines=True, warn_bad_lines=True, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None)

参数解释(ps:官方文档

filepath_or_buffer : 路径 URL 可以是http, ftp, s3, 和 file

sep: 指定分割符,默认是’,’C引擎不能自动检测分隔符,但Python解析引擎可以

header: 指定第几行作为列名(忽略注解行),如果没有指定列名,默认header=0; 如果指定了列名header=None

index_col: 默认为None 用列名作为DataFrame的行标签,如果给出序列,则使用MultiIndex。如果读取某文件,该文件每行末尾都有带分隔符,考虑使用index_col=False使panadas不用第一列作为行的名称。

dtype: E.g. {‘a’: np.float64, ‘b’: np.int32} 指定数据类型

encoding: 编码方式

engine:{‘c’, ‘python’}, optional c更快,python更灵活