DataFrame是Pandas中的一个表结构的数据结构,包括三部分信息,表头(列的名称),表的内容(二维矩阵),索引(每行一个唯一的标记)。

一、DataFrame的创建

有多种方式可以创建DataFrame,下面举例介绍。

例1: 通过list创建

>>> import pandas as pd
>>> df = pd.DataFrame([[1,2,3],[4,5,6]])
>>> df
0 1 2
0 1 2 3
1 4 5 6 [2 rows x 3 columns]

上面代表,创建了一个2行3列的表格,创建时只指定了表格的内容(通过一个嵌套的list),没有指定列名和索引。
这时列名就自动为 0,1,2 ;索引自动为数值0,1.

我们可以指定列表和索引,如:

>>> df = pd.DataFrame([[1,2,3],[4,5,6]],index=['row1','row2'],columns=['c1','c2','c3'])
>>> df
c1 c2 c3
row1 1 2 3
row2 4 5 6 [2 rows x 3 columns]

可以看出,上面代码通过index和 columns参数指定了索引和列名。

例2:创建例子

>>> import numpy as np
>>> dates = pd.date_range('',periods=6)
>>> df = pd.DataFrame(np.random.randn(6,4) , index = dates,columns=list('abcd'))
>>> df
a b c d
2012-10-01 -0.236220 0.586985 0.784953 -0.507129
2012-10-02 -1.020807 -1.316997 -0.747997 1.909333
2012-10-03 0.085208 -0.281736 1.112287 1.572577
2012-10-04 0.008708 -0.925711 -0.615752 -1.183397
2012-10-05 1.158198 -1.393678 0.586624 0.202499
2012-10-06 1.149878 -2.383863 1.646403 1.647935 [6 rows x 4 columns]

上面代码创建的dates是个时间索引,np.random.randn 方法创建一个6行4列的随机数矩阵。
最后的df使用 dates作为索引,使用np.random.randn 方法创建的矩阵作为内容,使用 list('abcd')作为列名。

二、 DataFrame的一些基本操作

1、获取数据的行数

len(df)

len(df.index)

2、显示索引、列和底层的numpy数据

>>> df.index
<class 'pandas.tseries.index.DatetimeIndex'>
[2012-10-01, ..., 2012-10-06]
Length: 6, Freq: D, Timezone: None
>>> df.columns
Index([u'a', u'b', u'c', u'd'], dtype='object')
>>> df.values
array([[-0.2362202 , 0.58698529, 0.78495289, -0.50712897],
[-1.02080723, -1.31699704, -0.74799734, 1.90933343],
[ 0.08520807, -0.28173589, 1.11228743, 1.57257716],
[ 0.00870768, -0.92571109, -0.6157519 , -1.18339719],
[ 1.15819829, -1.39367835, 0.586624 , 0.20249899],
[ 1.14987847, -2.38386297, 1.64640287, 1.64793523]])

说明,这个例子中的df使用的是上面创建的 DataFrame对象

3、显示数据

df.head([n])  # 获取df中的前n行数据,n不指定,则默认为5

df.tail([n])  # 获取df中的后n行数据,n不指定,则默认为5

>>> dates = pd.date_range('',periods=100)
>>>df = pd.DataFrame(np.random.randn(100,4) , index = dates,columns=list('abcd' ))
>>> df.head()
a b c d
2012-10-01 -1.010746 0.176277 -0.838870 0.742626
2012-10-02 0.111174 0.182840 0.193215 1.517350
2012-10-03 -0.757385 1.137521 -0.247181 0.659187
2012-10-04 -1.157838 1.464957 -2.106226 1.160796
2012-10-05 0.141747 0.032917 0.647210 -0.861413 [5 rows x 4 columns]
>>> df.tail()
a b c d
2013-01-04 -0.225416 -1.436526 -0.349813 -0.130948
2013-01-05 -1.544653 -0.214760 1.455662 0.050591
2013-01-06 0.582737 -0.646163 -1.763772 -1.463706
2013-01-07 -0.694467 0.710954 -2.227337 -0.257376
2013-01-08 0.282839 -1.100346 1.526374 1.658781

注意,head 和 tail 返回的是一个新的dataframe,与原来的无关

4、按照索引排序

newdf = df.sort_index(ascending=False,inplace=True)

ascending=False 参数指定按照索引值的以降序方式排序,默认是以升序排序。

inplace=True 指定为True时,表示会直接对df中的数据进行排序,函数返回值为None,newdf的值为None;

如果不设置为True(默认为false),则不会对df中数据进行修改,会返回一个新的df,这时newdf就有内容,是一个新的排序后的df。

5、添加数据(append方法)

append方法可以添加数据到一个dataframe中,注意append方法不会影响原来的dataframe,会返回一个新的dataframe。

语法:

DataFrame.append(otherDataignore_index=Falseverify_integrity=False)

其中otherData参数是要添加的新数据,支持多种格式。

ignore_index 参数默认值为False,如果为True,会对新生成的dataframe使用新的索引(自动产生),忽略原来数据的索引。

verify_integrity参数默认值为False,如果为True,当ignore_index为False时,会检查添加的数据索引是否冲突,如果冲突,则会添加失败。

举例说明1:

dates = pd.date_range('',periods=10)
df = pd.DataFrame(np.random.randn(10,4) , index = dates,columns=list('abcd')) dates1 = pd.date_range('',periods=2)
df1 = pd.DataFrame(np.random.randn(2,4) , index = dates1,columns=list('abcd')) df.append(df1) # df1中的2行数据会加到df中,且新产生的df的各行的索引就是原来数据的索引
df.append(df1,ignore_index=True) # df1中的2行数据会加到df中,且新产生的df的索引会重新自动建立
df.append(df1,verify_integrity=True) #会报错,因为df1的索引和df2的索引冲突了

说明,df1的列名必须和df一致,否则不是简单的添加行。而是会添加列,再添加行。

举例2:

>>> df.append({'a':10,'b':11,'c':12,'d':13},ignore_index=True)
a b c d
0 -0.471061 -0.937725 -1.444073 0.640439
1 -0.732039 -1.617755 0.281875 1.179076
2 1.115559 0.136407 -2.225551 0.119433
3 0.695137 0.380088 -0.318689 -0.048248
4 1.483151 -0.124202 -0.722126 0.035601
5 0.326048 -0.139576 -0.172726 0.931670
6 0.858305 0.857661 -0.279078 0.583740
7 -0.041902 0.408085 -1.019313 0.005968
8 0.626730 0.143332 -0.404894 0.377950
9 -1.850168 0.430794 -0.534981 -0.738701
10 10.000000 11.000000 12.000000 13.000000

上面代码是新产生的df会添加一行。这种操作,ignore_index参数值必须设置为True,否则会报错。

举例3:

>>> df.append({'e':10},ignore_index=True)
a b c d e
0 -0.471061 -0.937725 -1.444073 0.640439 NaN
1 -0.732039 -1.617755 0.281875 1.179076 NaN
2 1.115559 0.136407 -2.225551 0.119433 NaN
3 0.695137 0.380088 -0.318689 -0.048248 NaN
4 1.483151 -0.124202 -0.722126 0.035601 NaN
5 0.326048 -0.139576 -0.172726 0.931670 NaN
6 0.858305 0.857661 -0.279078 0.583740 NaN
7 -0.041902 0.408085 -1.019313 0.005968 NaN
8 0.626730 0.143332 -0.404894 0.377950 NaN
9 -1.850168 0.430794 -0.534981 -0.738701 NaN
10 NaN NaN NaN NaN 10

可以看出,如果插入的数据,指定的列名不存在,新产生的df不仅会增加行,还会增加列。

6、遍历数据

示例代码如下

for index,row in df.iterrows():
print index #获取行的索引
print row.a #根据列名获取字段
print row[0]#根据列的序号(从0开始)获取字段

7、查找数据

创建如下的dataframe

dates = pd.date_range('20121001',periods=10)
df = pd.DataFrame(np.random.randn(10,4) , index = dates,columns=list('abcd'))

可以有各种方式获取df中的全部或部分数据

df['a']  #按照列名获取指定的列,返回的是一个Series,其中key是索引,value是该列对应的字段值

df[:2] #获取前2行数据,效果等同 df[0:2],返回的是一个新的dataframe

df[2:5] #获取第3行~5行 这3条记录,返回的是一个新的dataframe

df.loc['20121009'] #获取指定索引的行,等同于  df.loc['2012-10-09'],返回的是一个Series,其中key是列名,value是该列对应的字段值

df.iloc[3]  #获取指定序号的行,这里是第4行

8、删除数据

del df['a']  #删除dataframe中指定的列,这个是直接影响当前的dataframe,注意 del不是函数,是python中的内置语句,没有返回值

df.drop(['a'],axis=1)  #删除指定的列,与上面的区别是不会影响原来的dataframe,dop方法会返回一个删除了指定列的新的dataframe

说明,dop方法既可以删除列,也可以删除行,但上面创建的df无法被删除行(?),下面这个例子可以删除行

data = pd.DataFrame(np.arange(16).reshape((4, 4)),index=['Ohio', 'Colorado', 'Utah', 'New York'],columns=['one', 'two', 'three', 'four'])

data.drop(['Colorado', 'Ohio'])

上面代码中的dop方法删除了指定索引的两行,注意同删除列一样,drop方法不会影响原来的dataframe,会返回一个删除后的新的dataframe

9、增加列

例子代码如下

dates = pd.date_range('',periods=10)
df = pd.DataFrame(np.random.randn(10,3) , index = dates,columns=list('abc')) df['d'] = pd.Series(np.random.randn(10),index=df.index)

上面代码先是创建了一个dataframe,然后通过df['d'] 插入了一个新的列。如果指定的列名存在,会修改列的内容。

10、修改指定行或单元格数据

df.values[i][j]= xxx  #其中i是行号,j是列号,都是从0开始

df.values[1]=12  # 会把一行中的所有列中的数据设置为同一个值,这里的参数1是序号,这里为第2行数据

df['a'] = 12  #这样会把指定列的所有数据都设置为同一个值,如这里的12。注意,如果指定的列名不存在,会新增列

11、插入行

前面介绍的append方法是产生一个新的 dataframe,不会改变原来的dataframe。

那有没有办法直接在当前的frame中插入一行数据呢?  上面介绍的 df[列名] = xxx 是用来插入或修改列的信息。

Python 数据处理扩展包: pandas 模块的DataFrame介绍(创建和基本操作)的更多相关文章

  1. Python 数据处理扩展包: numpy 和 pandas 模块介绍

    一.numpy模块 NumPy(Numeric Python)模块是Python的一种开源的数值计算扩展.这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list str ...

  2. Python 数据处理扩展包: pandas 模块的DataFrame介绍(读写数据库的操作)

    1.读取表中的内容,如下例子: import MySQLdb try: conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='root ...

  3. 吴裕雄--天生自然python学习笔记:pandas模块删除 DataFrame 数据

    Pandas 通过 drop 函数删除 DataFrarne 数据,语法为: 例如,删除陈聪明(行标题)的成绩: import pandas as pd datas = [[65,92,78,83,7 ...

  4. 吴裕雄--天生自然python学习笔记:pandas模块用 dataframe.loc 通过行、列标题读取数据

    用 df.va lue s 读取数据的前提是必须知道学生及科目的位置,非常麻烦 . 而 df.loc 可直接通过行.列标题读取数据,使用起来更为方便 . 使用 df.loc 的语法为: 行标题或列标题 ...

  5. Python进阶(十一)----包,logging模块

    Python进阶(十一)----包,logging模块 一丶包的使用 什么是包: ​ 包是通过使用 .模块名的方式组织python模块名称空间的方式. 通俗来说,含有一个__init__.py文件的文 ...

  6. 关于python中的包,模块导入的问题详解(一)

    最近由于初学python,对包,模块的导入问题进行了资料的搜集,查阅,在这里做一个总结: 一: import 模块 在import的过程中发生了什么?我们用一个实验来说明: 以上截图表明:在impor ...

  7. Python之扩展包安装

    读者朋友,在比较新的版本(Python 2 >=2.7.9 or Python 3 >=3.4)中,pip或者easy_install 扩展包命令已经默认安装(可查看   你的安装目录\p ...

  8. Python学习 之 包和模块

    1.rpm -ql python #查看python在计算机中安装了哪些文件 2.模块是一个可以导入的Python脚本文件 包是一堆按目录组织的模块和子包,目录下的__init__.py文件存放了包的 ...

  9. Python和C++的混合编程(使用Boost编写Python的扩展包)

    想要享受更轻松愉悦的编程,脚本语言是首选.想要更敏捷高效,c++则高山仰止.所以我一直试图在各种通用或者专用的脚本语言中将c++的优势融入其中.原来贡献过一篇<c++和js的混合编程>也是 ...

随机推荐

  1. 安装 Rational Rose 启动报错:无法启动此程序,因为计算机中丢失 suite objects.dll

    安装完以后提示找不到 suite objects.dll: 经查找,该 dll 存在: 找不到的原因是,安装程序自动设置在 Path 中的环境变量有误: 把最后的 common 改成 Common: ...

  2. 打包mysql、tomcat、jdk为一个软件

    打包mysql.tomcat.jdk为一个软件 博客分类: 成长中的点滴  . 我们在本地开发web应用的时候,直接在IDE里面就可以完成jdk.容器.数据库的配置和集成. 但是如果当我们把应用程序交 ...

  3. C++模板:读入优化

    int scan(int &x){ while(c=getchar(),c<'0'||c>'9');x=c-'0'; while(c=getchar(),c>='0'& ...

  4. Scrambled Polygon(斜率排序)

    Scrambled Polygon Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7799   Accepted: 3707 ...

  5. 1005 - Rooks(规律)

    1005 - Rooks   PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: 32 MB A rook is ...

  6. hdu1715 大菲波数

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1715 Problem ...

  7. Oracle游标循环更新数据案例

    declare v_XTXMBH number; v_ZJZJZJRQ varchar2(40); cursor c_job is SELECT XT.XTXMBH AS XTXMBH, QJ.ZJZ ...

  8. codeforces 623A. Graph and String 构造

    题目链接 给出一个图, 每个节点只有三种情况, a,b, c. a能和a, b连边, b能和a, b, c,连边, c能和b, c连边, 且无重边以及自环.给出初始的连边情况, 判断这个图是否满足条件 ...

  9. C语言之固定格式输出当前时间

    固定格式输出当前时间 编程实现将当前时间用以下形式输出:星期  月  日   小时:分:秒   年 代码如下: #include<stdio.h>#include<stdlib.h& ...

  10. Xamarin.Android开发实践(一)

    原文:Xamarin.Android开发实践(一) 一.准备工作 1.创建一个空的解决方案,并命名为Phoneword 2.右击解决方案 新建->新建项目 并命名为Phoneword_Droid ...