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')

posted on 2018-01-16 17:20  枫飞飞  阅读(239)  评论(0编辑  收藏  举报