最近在做一些真实实验数据的处理,用到了pandas库,也着着实实感受到了pandas的魅力,这篇博客做个总结以及扩展。
Pandas基于两种数据类型:series与dataframe。series是一个一维的数据类型,其中每一个元素都有一个标签,标签可以是数字或者字符串;一个dataframe是一个二维的表结构,Pandas的dataframe可以存储许多种不同的数据类型,并且每一个坐标轴都有自己的标签。你可以把它想象成一个series的字典项.
# 以下是一些比较常规的起始处理
import pandas as pd
data_path = './data.xls'
df = pd.read_excel(data_path, sheet_name=0, header=0) # 注意如果表中没有header,则header=None
# 正则表达式用于修改列名
regex = re.compile(pattern='[\u4e00-\u9fa5|a-zA-Z]{1,}[(]?[\u4e00-\u9fa5]?[)]?')
column_names = [regex.search(i).group() for i in df.columns.values.tolist()]
df.columns = column_names
# 数据类型转换
df[column_names[1:]] = df[column_names[1:]].apply(pd.to_numeric)
# 设置其中某一列为index列,并转换类型
df.set_index(['列名'], inplace=True)
df.index = df.index.astype(str)
df.sort_index(ascending=False)
df.reset_index(drop=True) # 使index列从0开始排列
df.to_csv('path')
# 或则 df.to_excel()
# 或则 df.to_dict()
pd.options.display.float_format = '{:, .3f}'.format
df.head(n) # 查看前n个记录
df.tail(n) # 查看后n个记录
df.describe() # 包含多种统计信息,如均值,方差等
len(df) # 记录的条数
df.sum(axis=1) # 统计函数
df.mean(axis=0)
df.max()
df.min()
df.std()
# 重新给记录排列顺序,即打乱数据
df.sample(frac=1).reset_index(drop=True)
import pandas as pd
data=[[1,2,3],[4,5,6]]
index=['a','b']#行号
columns=['c','d','e']#列号
df=pd.DataFrame(data,index=index,columns=columns)
loc——通过行标签索引行数据
df.loc['a'] # 返回index值为 'a' 的一行,
iloc——通过行号索引行数据
df.iloc[0] #
df.iloc[0].values #
df.iloc[0].values.tolist() # class list
ix——通过行标签或者行号索引行数据(基于loc和iloc 的混合)
df.ix[0] #
df.ix['a'] #
df.loc[:,'c':'d']
df.iloc[:,0:2]
df.ix[:,'c':'d']
df.ix[:,0:2]
# 需要注意的是结果都为
'''
c d
a 1 2
b 4 5
'''
df['列名']
df.列名
df_norm = df.apply(lamda x: (x-np.mean(x))/(np.std(x))) # 返回归一化数据
# boolean masking 技术
# 筛选信息技术基础>85份, 基础化学小于93分的同学
df[(df['信息技术基础']>85) & (df['基础化学']<93)]
# 筛选某字段是以某子串开头的记录
df[ df['列名'].str.startswith('some-thing')]
apply()是一种让函数作用于列或者行操作;
df.apply(func=lambda x: x.max()-x.min(), axis=1) # 1表示行;0表示列
applymap()是一种让函数作用于DataFrame每一个元素的操作;
df.applymap(func=lambda x: x-1) # 使每个元素都减1操作
map是一种让函数作用于Series每一个元素的操作
df['列名'].map(lambda x: x-1) # 使某一列每个元素减1操作
df = pd.DataFrame(
[
[1, 2, 3, 4],
[5, 6, 7, 8]
]
)
df2 = pd.DataFrame(
[
[1, 99, 98],
[5, 69, 78]
]
)
# merge函数用于合并, on 可以指定数字(index)或列名
df = df.merge(df2, on=[0])
print(df)
"""
0 1_x 2_x 3 1_y 2_y
0 1 2 3 4 99 98
1 5 6 7 8 69 78
"""
快速作图
pandas这个简单的功能还是很给力的,可以用一用, pandas关于绘图还有不少其他方面,下次有机会我做个总结,这里简单一点,点到为止:
df = pd.DataFrame(
[
[1, 2, 3],
[3, 4, 6],
[5, 6, 6],
[7, 8, 8],
[9, 10, 9]
],
columns=['a', 'b', 'c'],
index=[1, 2, 3, 4, 5]
)
# print(df)
import matplotlib.pyplot as plt
df.plot(x=0, y=[1, 2])
plt.show()
筛选
import pandas as pd
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
df1=pd.DataFrame(a,index=['row0','row1','row2'],columns=list('ABC'))
df2=df1.copy() # 重新开辟一个空间存储一份和df1一样的数据
删除/选取某行含有特定数值的行
df1[df1['A'].isin([1])] # 选取df1中A列包含数字1的行
df1[~df1['A'].isin([1])] #通过~取反,选取不包含数字1的行
删除/选取某行含有特定数值的列
cols=[x for i,x in enumerate(df2.columns) if df2.iat[0,i]==3] # #利用enumerate对row0进行遍历,将含有数字3的列放入cols中
df2[cols] 选取含有特定数值的列
df2.drop(cols,axis=1) #利用drop方法将含有特定数值的列删除