对于数据科学家,无论是数据分析还是数据挖掘来说,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_index | ignore_index 忽略需要连接的frame本身的index。当原本的index没有特别意义的时候可以使用。 |
join_axes | Index对象列表。用于其他n-1轴的特定索引,而不是执行内部/外部设置逻辑。 |
keys | 可以给每个需要连接的df一个label。 |
levels | 序列列表,默认值无。用于构建MultiIndex的特定级别(唯一值)。否则,它们将从键推断。 |
names | list,default无。结果层次索引中的级别的名称。 |
verify_integrity | bool值,默认为False。检查新连接的轴是否包含重复项。这相对于实际的数据串联可能是非常昂贵的。 |
copy | bool值,默认 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 |
errors | errors='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)
参数 | 说明 |
---|---|
n | int, optional 随机抽样返回的items个数。不可以与frac同时使用 |
frac | float, optional 要返回的 axis items 数量的比率。不能与n一起使用。小于1时是降采样,大于1时是升采样 |
replace | bool, default False 是否是有放回取样 |
weights | str or ndarray-like, optional 权重,默认的“None”将导致相等的概率权重。如果传递了一个序列,将与目标对象上的索引对齐 |
random_state | int 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中文网