Bootstrap

import pandas 使用方法

对于数据科学家,无论是数据分析还是数据挖掘来说,Pandas是一个非常重要的Python包。它不仅提供了很多方法,使得数据处理非常简单,同时在数据处理速度上也做了很多优化,使得和Python内置方法相比时有了很大的优势。

导入数据

  • pd.read_csv(filename, dtype={‘Payment Transaction ID’:‘str’}):从CSV文件导入数据
  • pd.read_table(filename):从限定分隔符的文本文件导入数据
  • pd.read_excel(filename):从Excel文件导入数据
  • pd.read_sql(query, connection_object):从SQL表/库导入数据
  • pd.read_json(json_string):从JSON格式的字符串导入数据
  • pd.read_pickle(‘test.pkl’)
  • pd.read_html(url):解析URL、字符串或者HTML文件,抽取其中的tables表格
  • pd.read_clipboard():从你的粘贴板获取内容,并传给read_table()
  • pd.DataFrame(dict):从字典对象导入数据,Key是列名,Value是数据

输出数据

  • pd.to_csv(path, index=True) 导出到CSV表格
  • pd.to_csv(path, index_col=0) 导出到CSV表格,取消index行号输出
  • df.to_pickle(‘test.pkl’) python object 直接存储到文件
# pkl存储的多维数据
df.to_pickle('test.pkl')

df = pd.read_pickle("test.pkl")
d2 = pd.DataFrame(df).astype(int)
d3 = np.array(d2)

DataFrame初始化

df = pd.DataFrame(np.arange(12).reshape(3,4), columns=['a','b','c','d'])

新增行/列

方法1:使用insert()函数 插入新列

DataFrame.insert(loc, column, value,allow_duplicates = False)

参数说明
loc必要字段,int类型数据,表示插入新列的列位置,原来在该位置的列将向右移。
column必要字段,插入新列的列名。
value必要字段,新列插入的值。如果仅提供一个值,将为所有行设置相同的值。可以是int,string,float等,甚至可以是series /值列表。
allow_duplicates布尔值,用于检查是否存在具有相同名称的列。默认为False,不允许与已有的列名重复。

方法2:直接赋值 df[column_name] = value
这种方法只能在最后一列插入

方法3:使用reindex()函数

DataFrame.reindex(labels=None, index=None, columns=None, axis=None, method=None, copy=True, level=None, fill_value=nan, limit=None, tolerance=None)

df.reindex(columns=[原来所有的列名,新增列名],fill_value=值)
df.reindex(index=[原来所有的行名,新增行名],fill_value=值)

参数说明
labels新标签/索引, 与axis配合使用,使“ axis”指定的轴与之一致。
index, columns要符合的新标签/索引。index是行,column是列
axis轴到目标。可以是轴名称(“索引”,“列”)或数字(0、1)。
method{None,“ backfill” /“ bfill”,“ pad” /“ ffill”,“ nearest”},可选
copy即使传递的索引相同,也返回一个新对象
level在一个级别上广播,在传递的MultiIndex级别上匹配索引值
fill_value在计算之前,请使用此值填充现有的缺失(NaN)值以及成功完成DataFrame对齐所需的任何新元素。如果两个对应的DataFrame位置中的数据均丢失,则结果将丢失。
limit向前或向后填充的最大连续元素数
tolerance不完全匹配的原始标签和新标签之间的最大距离。匹配位置处的索引值最满足方程abs(index [indexer]-target)

方法4:利用loc的行列索引标签添加新列
df.loc[:,新列名]=值

df.insert(loc=3, column='last', value=3)
df.insert(loc=0 column='first', value=np.arange(df.shape[0]))

df['last'] = 3
df['last'] = np.arange(df.shape[0]) 

df.reindex(columns =["A", "B", "C", "last"], fill_value = 3) # 新增last列
df.reindex(index =["A", "B", "C", "last"], fill_value = 3) # 新增last行

df.loc[:,'last'] = 3
df.loc[:,'last'] = np.arange(df.shape[0])

数据合并

使用concat()函数

pandas.concat(  objs, 
                axis=0, 
                join='outer', 
                join_axes=None, 
                ignore_index=False, 
                keys=None, 
                levels=None, 
                names=None,
                verify_integrity=False, 
                copy=True)
参数说明
objs需要连接的对象。eg: [df1, df2]
axis轴的方向,选择行合并合适列合并,默认为0。axis = 0, 表示在水平方向(row)进行连接 axis = 1, 表示在垂直方向(column)进行连接
join默认为“outer”,outer为并集/inner为交集。
ignore_indexignore_index 忽略需要连接的frame本身的index。当原本的index没有特别意义的时候可以使用。
join_axesIndex对象列表。用于其他n-1轴的特定索引,而不是执行内部/外部设置逻辑。
keys可以给每个需要连接的df一个label。
levels序列列表,默认值无。用于构建MultiIndex的特定级别(唯一值)。否则,它们将从键推断。
nameslist,default无。结果层次索引中的级别的名称。
verify_integritybool值,默认为False。检查新连接的轴是否包含重复项。这相对于实际的数据串联可能是非常昂贵的。
copybool值,默认 True。如果为False,请勿不必要地复制数据
df = pd.concat([df1, df2], axis=0, ignore_index=True)

删除某行/某列

方法1: 使用drop函数

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

参数说明
labels接收string或array,代表要删除的行或列的标签(行名或列名)。
axis接收0或1,代表操作的轴(行或列)。默认为0,代表行;1为列。
level接收int或索引名,代表标签所在级别。默认为None
inplace接收布尔值,代表操作是否对原数据生效,默认为False
errorserrors='raise’会让程序在labels接收到没有的行名或者列名时抛出错误导致程序停止运行,errors='ignore’会忽略没有的行名或者列名,只对存在的行名或者列名进行操作。默认为‘errors=‘raise’’。

方法2: 使用del
del df[‘列名’] 一次只能删除一列

df = pd.DataFrame({
                    'a': [1, 2],
                    'b': [True, False],
                    'c': [1.0, 2.0],
                    'd': ['1','2']
                  })

df.drop(2) // 删除第2行
df.drop([0,1]) //删除 0 1 行

df1 = df.drop(labels='d', axis=1) // 删除d列  df1列有被删除, df原数据保留
// 没有加入inplace参数,默认不会对原来数据进行修改,需要将结果赋值给新的变量
df1 = df.drop(labels='d', axis=1, inplace=True) // df1 =  df


del df['d'] // 删除d列

清空DataFrame 保留表头

df=df.drop(index=df.index)
df.drop(df.index, inplace=True)

df:任意的Pandas DataFrame对象【比如pd的返回值】
s:任意的Pandas Series对象

pandas 显示配置

pd.set_option('display.max_rows', 200)  //设置最大显示200行数据
pd.set_option('display.min_rows', 20)	//设置最小显示20行数据

pd.set_option ('display.max_colwidth',50) // 设置列宽

pd.set_option( 'display.precision',2)  // 设置显示的浮点数精度,不影响数据,只是显示

pd.set_option('display.float_format',  '{:,.2f}'.format) //浮点数格式化
pd.set_option('display.float_format', '{:.2f}%'.format)  //百分数格式化

## 设置绘图后端,pandas默认使用matplotlib作为绘图后端
## 当然也可以选择使用 比如plotly,bokeh等第三方库
pd.set_option('plotting.backend', 'altair')
data = pd.Series(np.random.randn(100).cumsum())
data.plot()

判断dataFrame是否非空

# DataFrame 内置的属性,可以看到虽然调用简单,但他是最耗时的
df.empty
# 通过Python内置len方法判断 DataFrame 的行数,相对来说速度比较快,是第1种的3倍
len(df)==0 
# 判断 DataFrame 的行索引的值数量,这已经到达纳秒级别了,是其中最快的方式
len(df.index)==0

查看DataFrame 基本信息

  df.head(n) //查看DataFrame对象的前n行
  df.tail(n):查看DataFrame对象的最后n行
  df.shape():查看行数和列数
    df.shape[0] //行
    df.shape[1] //列
  df.info():查看索引、数据类型和内存信息
  df.describe():查看数值型列的汇总统计 s.
  
  s.value_counts(dropna=False):查看Series对象的唯一值和计数
  df.apply(pd.Series.value_counts):查看DataFrame对象中每一列的唯一值和计数

查看数值型 or 类别型等

做数据分析时,需要对特征进行归类–类别型还是数值型,pandas提供了select_dtypes函数,函数原型

DataFrame.select_dtypes(include=None, exclude=None)

df.select_dtypes(include = ['int64','float64'])
df.select_dtypes(include = 'bool')
df.select_dtypes(exclude = 'object')

df = pd.DataFrame({
                    'a': [1, 2],
                    'b': [True, False],
                    'c': [1.0, 2.0],
                    'd': ['1','2']
                  })
df.info()

查找/遍历数据

  • loc :Selection by Label函数,即为按标签取数据,例如第一个参数选择index,第二个参数选择column
  • iloc:函数为Selection by Position,即按位置选择数据,即第n行,第n列数据,只接受整型参数

df = pd.DataFrame([[1,2,3,4], [5,6,7,8], [9,10,11,12]],
	 index=['first', 'second', 'third'],
     columns=['a', 'b','c','d'])


df.loc['first', 'c']  # 取第一行, 第c列
df.loc['second':'third', 'b']
df.loc[df['b'] > 5] #先筛选 c这一列大于5所在的数据,并且筛选出对应的这几行



df.iloc[0:2, 0:1] # 先定位行,再定位列
df.iloc[[0, 1]] # 取前两行

df.iloc[:, -1] # 取最后一列


for index in range(result_pd.shape[0]):
    data_name = result_pd.loc[index, 'name']

for index, datarow in trip_data.iterrows():
	data_name = datarow['name']

乱序 / 随机采样

对于数据集处理,通常需要打算数据顺序,重新洗牌

  • 使用pandas中自带的 sample 支持降采样和升采样
  • 使用sklearn库的shuffle函数
DataFrame.sample(self: ~ FrameOrSeries, 
	n=None, 
	frac=None, 
	replace=False, 
	weights=None, 
	random_state=None, 
	axis=None) 
参数说明
nint, optional 随机抽样返回的items个数。不可以与frac同时使用
fracfloat, optional 要返回的 axis items 数量的比率。不能与n一起使用。小于1时是降采样,大于1时是升采样
replacebool, default False 是否是有放回取样
weightsstr or ndarray-like, optional 权重,默认的“None”将导致相等的概率权重。如果传递了一个序列,将与目标对象上的索引对齐
random_stateint or numpy.random.RandomState, optional 用于随机数生成器(如果是int类型的参数)或numpy RandomState对象的种子。
axis{0 or ‘index’, 1 or ‘columns’, None}, default None 采样的轴。可以是axis的编号或名称。 默认是行
df.sample(frac=1)  // frac=1表示乱序,重新洗牌
df.sample(frac=1).reset_index(drop=True) // 行号 index重新排序

df.sample(frac=0.5, replace=True, random_state=1)
extract = df['collum_2'].sample(n=3, random_state=20)

 df.sample(n=0.5, weights='num_specimen_seen', random_state=1) // 该列数据中值较大的行更容易被采样


from sklearn.utils import shuffle
df = shuffle(df)

排序

  • DataFrame.sort_index()
  • DataFrame.sort_value()
print(frame.sort_index(ascending=True))  # 按行 Index升序排序
print(frame.sort_index(ascending=False)) # 按行 Index降序排序

print(frame.sort_index(axis=1))  # 按列索引排序

print(frame.sort_values(by='a')) # 按照 ‘a’列的值排序
print(frame.sort_values(by=['a','c'])) # 按照 ‘a’列 和 ‘c’的值排序

示例

import pandas as pd

RAW_DATA_DIR = 'data_raw/'

##将一个或多个路径正确地连接起来
sample_tsv_path = os.path.join(RAW_DATA_DIR, 'normal_1/airsim_rec.txt')
#读取数据
sample_tsv = pd.read_csv(sample_tsv_path, sep='\t')
dataframe = pd.read_csv("test.csv",index_col=0) # 去除第一列的行号
#查看数据
sample_tsv.head()

可视化 画图

DataFrame.plot( )

DataFrame.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, 
               position=0.5, 
               table=False, 
               yerr=None, 
               xerr=None, 
               stacked=True/False,
               sort_columns=False, 
               secondary_y=False, 
               mark_right=True, **kwds)

参数说明

x和y:表示标签或者位置,用来指定显示的索引,默认为None
kind:表示绘图的类型,默认为line,折线图
line:折线图
bar/barh:柱状图(条形图),纵向/横向
pie:饼状图
hist:直方图(数值频率分布)
box:箱型图
kde:密度图,主要对柱状图添加Kernel 概率密度线
area:区域图(面积图)
scatter:散点图
hexbin:蜂巢图
ax:子图,可以理解成第二坐标轴,默认None
subplots:是否对列分别作子图,默认False
sharex:共享x轴刻度、标签。如果ax为None,则默认为True,如果传入ax,则默认为False
sharey:共享y轴刻度、标签
layout:子图的行列布局,(rows, columns)
figsize:图形尺寸大小,(width, height)
use_index:用索引做x轴,默认True
title:图形的标题
grid:图形是否有网格,默认None
legend:子图的图例
style:对每列折线图设置线的类型,list or dict
logx:设置x轴刻度是否取对数,默认False
logy
loglog:同时设置x,y轴刻度是否取对数,默认False
xticks:设置x轴刻度值,序列形式(比如列表)
yticks
xlim:设置坐标轴的范围。数值,列表或元组(区间范围)
ylim
rot:轴标签(轴刻度)的显示旋转度数,默认None
fontsize : int, default None#设置轴刻度的字体大小
colormap:设置图的区域颜色
colorbar:柱子颜色
position:柱形图的对齐方式,取值范围[0,1],默认0.5(中间对齐)
table:图下添加表,默认False。若为True,则使用DataFrame中的数据绘制表格
yerr:误差线
xerr
stacked:是否堆积,在折线图和柱状图中默认为False,在区域图中默认为True
sort_columns:对列名称进行排序,默认为False
secondary_y:设置第二个y轴(右辅助y轴),默认为False
mark_right : 当使用secondary_y轴时,在图例中自动用“(right)”标记列标签 ,默认True
x_compat:适配x轴刻度显示,默认为False。设置True可优化时间刻度的显示

参考文档

  • https://blog.csdn.net/qq_33399185/article/details/60872853
  • https://zhuanlan.zhihu.com/p/475830334
  • Pandas中文网
;