文件读取与写入
- 文件读取的格式:
pd.read_csv(‘文件名’)
pd.read_txt(‘文件名’)
pd.read_excel(‘文件名’)前提:有xlrd包
read_hdf ,read_sql,read_json,read_html
还有stata,sas,clipboard,pickle - 写入文件格式:
data.to_csv(‘文件名’,index=False
) #保存时除去行索引
data.to_excel(‘name.xlsx’, sheet_name=‘Sheet1’)前提:有openpyxl包
基本数据结构
1. Series
- Series有四个属性为值(value),索引(index),名字(name),类型(dtype)
eg.
name = pd.Series(np.random.randn(2),index=[‘a’,‘b’],name=‘这是一个Series’,dtype=‘float64’)
output:
a 1.433496
b -0.005432
Name: 这是一个Series, dtype: float64 - 通过索引取元素:name[‘a’]
2. DataFrame
-
DataFrame有名称的矩阵,框架:
-index是行的名称,columns是列名 pd.DataFrame(np.random.randn(6,4),index=dates,columns = [‘a’,‘b’,‘c’,‘d’])
-按字典形式创建:pd.DataFrame({‘col1’:list(‘abcde’),‘col2’:range(5,10),‘col3’:[1.3,2.5,3.6,4.6,5.8]}, index=list(‘一二三四五’)) -
修改行/列名:df.rename(index/columns={‘oldname’:‘newname’})
-
索引对齐特性:算数运算时,索引相同的项对应运算
df1 = pd.DataFrame({‘A’:[1,2,3]},index=[1,2,3])
df2 = pd.DataFrame({‘A’:[1,2,3]},index=[3,1,2])
df1-df2 #由于索引对齐,因此结果不是0 -
删除,可以使用drop函数或del或pop
df.drop(index=‘五’,columns=‘col1’)?inplace=False在原DataFrame中改动 默认false?
df[‘col1’]=[1,2,3,4,5] del df[‘col1’]
df[‘col1’]=[1,2,3,4,5] df.pop(‘col1’)返回被删除的列
-
增加:
df1[‘B’]=list(‘abc’)
df1.assign(C=pd.Series(list(‘def’)))assign方法不会对原DataFrame做修改
(注意:list默认索引从0开始) -
根据类型选择列:
df.select_dtypes(include=[‘number/float/int等’]).head() -
将Series转换为DataFrame:
s.to_frame()
s.to_frame().T转置
常用基本函数
- df.head(n)显示前n行 同理:df.tail(n)后n行
- unique和nunique:
nunique显示有多少个唯一值:df[‘Physics’].nunique()
unique显示所有的唯一值 - count和value_counts
count返回非缺失值元素个数:df[‘Physics’].count()
value_counts返回每个元素有多少个 - describe和info
info函数返回有哪些列、有多少非缺失值、每列的类型:df.info()
describe默认(df[‘Physics’].describe()可以描述非数值型数据)统计数值型数据的各个统计量(mean std max min …)可自行选择分位数:df.describe(percentiles=[.05, .25, .75, .95]) - idxmax和nlargest
idxmax函数返回最大值索引 df[‘Math’].idxmax()
nlargest函数返回前n个大的元素值 df[‘Math’].nlargest(n) - clip和replace替换函数
clip是对超过或者低于某些值的数进行截断(超过的改为上限值,低于的改成下限值)
replace对某些值进行替换:street_1变成one,street_2变为two
df[‘Address’].replace([‘street_1’,‘street_2’],[‘one’,‘two’])
df.replace({‘Address’:{‘street_1’:‘one’,‘street_2’:‘two’}}) - apply函数
df[‘Math’].apply(lambda x:str(x)+’!’) 迭代Series每一列的值操作
df.apply(lambda x:x.apply(lambda x:str(x)+’!’))迭代DataFrame每一个列操作第一个lambda函数中的x是School等列索引,后面一个lambda函数中的x看做是其对应所有的元素,用apply方法分别进行了遍历
不清楚函数传入了什么,可以用lambda x:print(x)看一下
排序
-
索引排序
df.set_index(‘Math’).sort_index()
set_index函数可以设置索引为math列
sort_index()默认按索引值升序排列,即ascending=True -
值排序
df.sort_values(by=‘Class’)
df.sort_values(by=[‘Address’,‘Height’]).head()
多个值排序,即先对第一层排,在第一层相同的情况下对第二层排序
问题练习总结
图源自阿布
【问题一】 Series和DataFrame有哪些常见属性和方法?
Series:属性value,name,index,dtype 方法:mean DataFrame:index,columns,values,shape 方法:del,drop,pop,assign,T
【问题二】 value_counts会统计缺失值吗?
不会
【问题三】 与idxmax和nlargest功能相反的是哪两组函数?
idxmin和nsmallest
【问题四】 在常用函数一节中,由于一些函数的功能比较简单,因此没有列入,现在将它们列在下面,请分别说明它们的用途并尝试使用。
sum求和/mean求均值/median求中位数/mad中位数绝对偏差/min求最小/max最大/abs绝对值/std标准差/var方差/quantile分位数/cummax累计求最大/cumsum累计求和/cumprod累计求积
【问题五】 df.mean(axis=1)是什么意思?它与df.mean()的结果一样吗?第一问提到的函数也有axis参数吗?怎么使用?
df.mean(axis=1)代表按行计算均值,结果不同;有这个参数,axis=1表示按行操作,也就是沿着x轴水平方向操作,axis=0表示按列操作,沿着垂直方向。