pandas2
1、Series
创建的方法统一为pd.Series(data,index=)
(1,2,3)
Series可以通过三种形式创建:python的dict、numpy当中的ndarray(numpy中的基本数据结构)、具体某个数值。index赋值必须是list类型。
s = pd.Series({‘a’=1,’b’=2,’d’=3},index = [‘a’,’d’,’c’,b’])
s = pd.Series(np.random.randn(5), index = list('ABCDE')
s=pd.Series([5,4]) s=pd.Series([5,4],index=list[‘abcd’])
2、DataFrame
DataFrame统一的创建形式为:pd.DataFrame(data,columns=,index=)
(1)
#创建日期索引序列
dates = pd.date_range('20130101', periods=6)
#创建Dataframe,其中 index 决定索引序列,columns 决定列名
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
print df
(2)
df2 = pd.DataFrame({ 'A' : 1.,
'B' : pd.Timestamp('20130102'),
'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
'D' : np.array([3] * 4,dtype='int32'),
'E' : pd.Categorical(["test","train","test","train"]),
'F' : 'foo' })
***********************************************
3.选择/切片
# 选择单独的一列,返回 Serires,与 df.A 效果相当。
df['A']
# 位置切片
df[0:3]
# 索引切片
df['20130102':'20130104']
# 通过标签选择
df.loc[dates[0]]
# 对多个轴同时通过标签进行选择
df.loc[:,['A','B']]
# 获得某一个单元的数据
df.loc[dates[0],'A']
# 或者
df.at[dates[0],'A'] # 速度更快的做法
# 通过位置进行选择
df.iloc[3]
# 切片
df.iloc[3:5,0:2]
# 列表选择
df.iloc[[1,2,4],[0,2]]
# 获得某一个单元的数据
df.iloc[1,1]
# 或者
df.iat[1,1] # 更快的做法
# 布尔索引
df[df.A > 0]
# 获得大于零的项的数值
df[df > 0]
# isin 过滤
df2[df2['E'].isin(['two','four'])]
其中,loc表示通过行标签索引行数据 需要注意的是,dataframe的索引[1:3]是包含1,2,3的,与平时的不同。?????
at表示 at的使用方法与loc类似,但是比loc有更快的访问数据的速度,而且只能访问单个元素,不能访问多个元素。
iloc表示通过行号获取行数据 如果说loc是按照索引(index)的值来选取的话,
那么iloc就是按照索引的位置来进行选取。iloc不关心索引的具体值是多少,只关心位置是多少,所以使用iloc时方括号中只能使用数值。
iat表示 iat对于iloc的关系就像at对于loc的关系,是一种更快的基于索引位置的选择方法,同at一样只能访问单个元素
ix 以上说过的几种方法都要求查询的秩在索引中,或者位置不超过长度范围,而ix允许你得到不在DataFrame索引中的数据。
注意:
1.data[:7][['rnd_1', 'rnd_2']] 选前6行,中括号中的这两列
但是loc与第一种方法不同之处在于会把第5行也选择进去,而第一种方法只会选择到第4行为止。
***************************************************
4.赋值
s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102', periods=6))
df['F'] = s1
df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])
df1.loc[dates[0]:dates[1],'E'] = 1
# 删除所有带有缺省项的行
df1.dropna(how='any')
# 填充缺省项
df1.fillna(value=5)
# 获得缺省项的布尔掩码
pd.isnull(df1)
*******************************************************
5.观察操作
# 观察开头的数据
df.head()
# 观察末尾的数据
df.tail(3)
# 显示索引
df.index
# 显示列
df.columns
# 显示底层 numpy 结构
df.values
# DataFrame 的基本统计学属性预览
df.describe()
"""
A B C D
count 6.000000 6.000000 6.000000 6.000000 #数量
mean 0.073711 -0.431125 -0.687758 -0.233103 #平均值
std 0.843157 0.922818 0.779887 0.973118 #标准差
min -0.861849 -2.104569 -1.509059 -1.135632 #最小值
25% -0.611510 -0.600794 -1.368714 -1.076610 #正态分布 25%
50% 0.022070 -0.228039 -0.767252 -0.386188 #正态分布 50%
75% 0.658444 0.041933 -0.034326 0.461706 #正态分布 75%
max 1.212112 0.567020 0.276232 1.071804 #最大值
"""
# 转置
df.T
# 根据某一轴的索引进行排序
df.sort_index(axis=1, ascending=False)
# 根据某一列的数值进行排序
df.sort_value(by=,ascending=) by表示按哪一个columns参数排序
??????????????????????????????????????
********************************************************
7.
查询数据的前5行或末尾5行
student.head()
student.tail()
查询指定的行
student.ix[[0,2,4,5,7]] #这里的ix索引标签函数必须是中括号[]
查询指定的列
student[['Name','Height','Weight']].head() #如果多个列的话,必须使用双重中括号
也可以通过ix索引标签查询指定的列
student.ix[:,['Name','Height','Weight']].head()
查询指定的行和列
student.ix[[0,2,4,5,7],['Name','Height','Weight']].head()
以上是从行或列的角度查询数据的子集,现在我们来看看如何通过布尔索引实现数据的子集查询。
查询所有女生的信息
student[student['Sex']=='F']
查询出所有12岁以上的女生信息
student[(student['Sex']=='F') & (student['Age']>12)]
查询出所有12岁以上的女生姓名、身高和体重
student[(student['Sex']=='F') & (student['Age']>12)][['Name','Height','Weight']]
上面的查询逻辑其实非常的简单,需要注意的是,如果是多个条件的查询,必须在&(且)或者|(或)的两端条件用括号括起来。
********************************************************
6.统计
# 求平均值 df.mean()
# 指定轴上的平均值 df.mean(1)
# 不同维度的 pandas 对象也可以做运算,它会自动进行对应,shift 用来做对齐操作。s = pd.Series([1,3,5,np.nan,6,8], index=dates).shift(2)
改操作是把数字向下移动了两个位置
# 对不同维度的 pandas 对象进行减法操作 df.sub(s, axis='index')
df减s
*******************************************************
7.函数
d1 = pd.Series(2*np.random.normal(size = 100)+3)
d2 = np.random.f(2,4,size = 100)
d3 = np.random.randint(1,100,size = 100)
random.normal()
random.f
random.randint
d1.count() #非空元素计算
d1.min() #最小值
d1.max() #最大值
d1.idxmin() #最小值的位置,类似于R中的which.min函数
d1.idxmax() #最大值的位置,类似于R中的which.max函数
d1.quantile(0.1) #10%分位数
d1.sum() #求和
d1.mean() #均值
d1.median() #中位数
d1.mode() #众数
d1.var() #方差
d1.std() #标准差
d1.mad() #平均绝对偏差
d1.skew() #偏度
d1.kurt() #峰度
d1.describe() #一次性输出多个描述性统计指标
**********************************************************
这里自定义一个函数,将这些统计描述指标全部汇总到一起:
def stats(x):
return pd.Series([x.count(),x.min(),x.idxmin(),
x.quantile(.25),x.median(),
x.quantile(.75),x.mean(),
x.max(),x.idxmax(),
x.mad(),x.var(),
x.std(),x.skew(),x.kurt()],
index = ['Count','Min','Whicn_Min',
'Q1','Median','Q3','Mean',
'Max','Which_Max','Mad',
'Var','Std','Skew','Kurt'])
stats(d1)
在实际的工作中,我们可能需要处理的是一系列的数值型数据框,如何将这个函数应用到数据框中的每一列呢?可以使用apply函数,这个非常类似于R中的apply的应用方法。
将之前创建的d1,d2,d3数据构建数据框:
df = pd.DataFrame(np.array([d1,d2,d3]).T,columns=['x1','x2','x3'])
df.head()
df.apply(stats)
**************结果********************
>>> df.apply(stats)
x1 x2 x3
Count 100.000000 100.000000 100.000000
Min -4.127033 0.010727 3.000000
Whicn_Min 81.000000 0.000000 76.000000
Q1 2.040101 0.270086 25.000000
Median 3.204555 0.867420 54.500000
Q3 4.434788 2.932584 73.000000
Mean 3.070225 2.027167 51.490000
Max 7.781921 19.139449 98.000000
Which_Max 39.000000 88.000000 96.000000
Mad 1.511288 2.007630 24.010800
Var 4.005609 9.366646 780.090808
Std 2.001402 3.060498 27.930106
Skew -0.649478 3.042986 -0.118917
Kurt 1.220109 11.611402 -1.211579
>>>
*****************************************************
7.相关系数(corr)和协方差矩阵(cov)
除以上的简单描述性统计之外,还提供了连续变量的相关系数(corr)和协方差矩阵(cov)的求解,这个跟R语言是一致的用法。
df.corr()
关于相关系数的计算可以调用pearson方法或kendell方法或spearman方法,默认使用pearson方法。
df.corr('spearman')
如果只想关注某一个变量与其余变量的相关系数的话,可以使用corrwith,如下方只关心x1与其余变量的相关系数:
df.corrwith(df['x1'])
数值型变量间的协方差矩阵
df.cov()
********************************************************
7.自动化对齐
由于s5中没有对应的g索引,s6中没有对应的e索引,所以数据的运算会产生两个缺失值NaN。注意,这里的算术结果就实现了两个序列索引的自动对齐,而非简单的将两个序列加总或相除。对于数据框的对齐,不仅仅是行索引的自动对齐,同时也会自动对齐列索引(变量名)
数据框中同样有索引,而且数据框是二维数组的推广,所以其不仅有行索引,而且还存在列索引
也就是说,只有行所以和列索引都对齐的才能运算,其他的都变为NAN
********************************************************
7.函数应用
# 累加
df.apply(np.cumsum)
*********************************************************
8.直方图
s = pd.Series(np.random.randint(0, 7, size=10))
s.value_counts()
"""
4 5
6 2
2 2
1 1
dtype: int64
String Methods
"""
***********************************************************
9.字符处理
s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])
s.str.lower()
"""
0 a
1 b
2 c
3 aaba
4 baca
5 NaN
6 caba
7 dog
8 cat
dtype: object
"""
*********************************************************
10.sql数据库的增删改查
增数据:用concat
增列:pd.DataFrame(student2,columns=['a','b','c','d']),直接在columns中写上新增的列名就行
删除表:del students2
删除指定的行:student.drop([1,3,4])
保留14岁以上的学生:student[student['Age']>14]
删除指定的列:student.drop(['Height','Weight'],axis=1).head()
不论是删除行还是删除列,都可以通过drop方法实现,只需要设定好删除的轴即可,即调整drop方法中的axis参数。默认该参数为0,表示删除行观测,如果需要删除列变量,则需设置为1。
修改数据:student.ix[student['name']=='liuchang','height']=170
**********************************************************
10.聚合函数
根据性别分组,计算各组别中学生身高和体重的平均值:
student.groupby('sex').mean()
如果不对原始数据作限制的话,聚合函数会自动选择数值型数据进行聚合计算。如果不想对年龄计算平均值的话,就需要剔除改变量:
student.drop('age',axis=1).groupby('sex').mean()
groupby还可以使用多个分组变量,例如根本年龄和性别分组,计算身高与体重的平均值:
student.groupby('sex','age').mean()
还可以对每个分组计算多个统计量:
student.drop('age',axis=1).groupby('sex').agg([np.mean,np.median])
**********************************************************
10.合并
使用 concat() 连接 pandas 对象:相同列之间直接合并
join 合并:不同列之间的笛卡尔积
merge:两边做关联,相当于join:
stu_score=pd.merge(student,score,on='name')
注意,默认情况下,merge函数实现的是两个表之间的内连接,即返回两张表中共同部分的数据。可以通过how参数设置连接的方式,left为左连接;right为右连接;outer为外连接。
内连接,外连接,左右连接?????????????????????
**********************************************************
11.删除nan:df.dropna(how='all')或者'any'
填充nan:df.fillna(0)
用前一个观测值填充:df.fillna(method='ffill')
用后一个观测值填充:df.fillna(method='bfill')
使用常量填充不同的列:df.fillna('x1':1,'x2':2,'x3':3)
用均值或者中位数填充各自的列:先算出各个列的均值或者中位数,再用上面的方法填充
**********************************************************
11.追加
在 dataframe 数据后追加行
df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])
s = df.iloc[3]
df.append(s, ignore_index=True)
*************************************************************
12.分组
# 对单个分组应用函数,数据被分成了 bar 组与 foo 组,分别计算总和。
df.groupby('A').sum()
# 依据多个列分组会构成一个分级索引
df.groupby(['A','B']).sum()
*************************************************************
13.数据透视表
pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'])
C bar foo
A B
one A -0.435493 -2.469078
B -1.134437 1.232294
C 0.397694 -0.146637
three A -1.073181 NaN
B NaN 2.225841
C 0.440227 NaN
two A NaN 0.023365
B -0.048074 NaN
C NaN -1.031985
*************************************************************
数据透视表详解:
pivot_table(data,values=None,
index=None,
columns=None,
aggfunc='mean',
fill_value=None,
margins=False,
dropna=True,
margins_name='All')
data:需要进行数据透视表操作的数据框
values:指定需要聚合的字段
index:指定某些原始变量作为行索引
columns:指定哪些离散的分组变量
aggfunc:指定相应的聚合函数
fill_value:使用一个常数替代缺失值,默认不替换
margins:是否进行行或列的汇总,默认不汇总
dropna:默认所有观测为缺失的列
margins_name:默认行汇总或列汇总的名称为'All'
eg:
pd.pivot_table(student,values=['height','weight'],columns=['sex'],aggfunc=[np.mean,np.median,np.std])
pd.pivot_table(student,values=['height','weight'],columns=['sex']).unstack()
**************************************************************
14.时间序列
rng = pd.date_range('1/1/2012', periods=100, freq='S')
ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)
ts.resample('5Min', how='sum')
ts_utc = ts.tz_localize('UTC')
# 转换为周期
ps = ts.to_period()
# 转换为时间戳
ps.to_timestamp()
************************************************************
15.多层索引:
data['a'] 返回最外层索引为a的数据
data['a','b'] 返回最外层索引为a和b 的数据
data[:,1] 返回最内层所有为1的所有数据
************************************************************
15.分类
df["grade"] = df["raw_grade"].astype("category")
df["grade"]
# 重命名分类
df["grade"] = df["grade"].cat.set_categories(["very bad", "bad", "medium", "good", "very good"])
# 根据分类的顺序对数据进行排序
df.sort("grade")
上面这两个函数报错???????????
***************************************
series.order()升序
series.order(ascending=False)降序
student.sort_values(by=[sex'','age'])
?????????????????????????
******************************************************************
16.作图
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts = ts.cumsum()
ts.plot()
************************************************************
17.数据IO
# 从 csv 文件读取数据
pd.read_csv('foo.csv')
# 保存到 csv 文件
df.to_csv('foo.csv')
# 读取 excel 文件
pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA'])
# 保存到 excel 文件
df.to_excel('foo.xlsx', sheet_name='Sheet1')