8. Pandas的DataFrame创建
Pandas的Dataframe是二维的,每一列都是一个Series结构。
Dataframe既可以通过列表也可以通过字典方式来创建,而且数据可以导入的方式也是非常多的。
8.1 字典数据创建DataFrame
DataFrame数据的创建和Series的创建类似,可以有很多方式。和Series一样也有字典类型的方式。
import pandas as pd
df = pd.DataFrame({'name' : "hello the cruel world".split(),
'growth' : [100, 125, 150, 200]},
index = "jack tom mike nike".split())
print df
执行结果如下:
growth name
jack 100 hello
tom 125 the
mike 150 cruel
nike 200 world
最左侧的一列是index或者label和Series类似,第二列是growth列,第三列是name列。growth和name为该列的名字。需要特别注意的是DataFrame和其他表格数据不一样的是,DataFrame是列访问机制。例如要访问growth下的150这条数据的访问方式为:
import pandas as pd
df = pd.DataFrame({'name' : "hello the cruel world".split(),
'growth' : [100, 125, 150, 200]},
index = "jack tom mike nike".split())
print df['growth']['mike']
print df.growth['mike']
print df.name,type(df.name)
print df["name"]
程序执行结果:
jack hello
tom the
mike cruel
nike world
Name: name, dtype: object <class 'pandas.core.series.Series'>
jack hello
tom the
mike cruel
nike world
Name: name, dtype: object
df.name是Series的,这点儿很重要。
8.2 Numpy数据创建DataFrame
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randn(10,3), columns = ["ca", "cb", "cc"], index = list("abcdefghij"))
print df
程序执行结果:
ca cb cc
a -1.445673 -0.856954 -0.085766
b -0.276927 -0.181103 -1.120856
c 1.155409 0.114528 1.514519
d -0.304959 -1.099241 -0.018434
e 0.458164 -0.550848 0.396272
f -0.362203 -0.383894 -0.444436
g -0.755501 -0.148579 -0.910084
h -0.666200 0.713844 1.822668
i -1.278918 -2.055927 -0.404884
j 0.340294 1.437949 -0.119828
DataFrame构造函数的columns函数给出列的名字,index给出label标签或index位置信息,创建DataFrame的数据是numpy创建的二维的数据。
8.3 csv文件创建DataFrame
- 从csv文件读取DataFrame数据,这里可以使用机器学习经典数据集iris.data数据作为测试数据,下载。iris.data文件的内容:
5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
4.6,3.1,1.5,0.2,Iris-setosa
5.0,3.6,1.4,0.2,Iris-setosa
5.4,3.9,1.7,0.4,Iris-setosa
4.6,3.4,1.4,0.3,Iris-setosa
可以使用pandas的read_csv函数来读取这个文件里的数据到DataFrame数据里。
import pandas as pd
cols_name = ['sepal length', 'sepal width', 'petal length', 'petal width', 'class']
df = pd.read_csv("iris.data", names = cols_name)
print df
程序执行结果:
sepal length sepal width petal length petal width class
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
iris.data文件里都是数据,而有些csv文件的第一行会给出每列数据的名字,例如股票交易信息类的csv文件通常都这样给出csv记录,可以从Nasdaq下载jd的历史交易记录,下载后存为jd.csv好了,和.py程序存储在同一个目录下。jd.csv的内容大致如下:
"date","close","volume","open","high","low"
"10:24","22.585","3,018,583","23.18","23.20","22.515"
"2018/10/23","23.2300","17943360.0000","22.6100","23.5900","22.3300"
"2018/10/22","23.5400","13934080.0000","23.8600","24.1100","23.3000"
"2018/10/19","23.0100","12953670.0000","23.9400","23.9499","22.9500"
"2018/10/18","23.3300","15580080.0000","23.5000","24.1321","23.2200"
它的第一行显然不是数据而是说明每列的数据是什么,这行数据是不能读入到DataFrame里的,应忽略掉。可以用pandas的read_csv先读一下这个文件。
import pandas as pd
df = pd.read_csv("jd.csv")
print df
程序执行结果如下:
date close volume open high low
0 10:24 22.585 3,018,583 23.180 23.2000 22.5150
1 2018/10/23 23.230 17943360.0000 22.610 23.5900 22.3300
2 2018/10/22 23.540 13934080.0000 23.860 24.1100 23.3000
3 2018/10/19 23.010 12953670.0000 23.940 23.9499 22.9500
4 2018/10/18 23.330 15580080.0000 23.500 24.1321 23.2200
5 2018/10/17 23.680 15368750.0000 24.520 24.6100 23.4600
6 2018/10/16 24.630 11679180.0000 24.500 24.7000 24.0800
7 2018/10/15 24.140 11132030.0000 24.110 24.6400 23.8000
8 2018/10/12 24.450 20191050.0000 24.540 24.9000 23.7400
这里有几个问题,1). index是自动用数字作为各行数据的index或label,一般应该用date做index或label作为股票分析时使用比较好,2).如果jd.csv文件的头几行是文件的说明,那么read_csv读的时候也会当作数据,这时应能忽略掉头几行非数据的信息。3). 数据读入后类型是否正确读出?
import pandas as pd
df = pd.read_csv("jd.csv", index_col = 0)
print df[:5]
print df.dtypes
程序执行结果:
close volume open high low
10:24 22.585 3,018,583 23.18 23.2000 22.515
2018/10/23 23.230 17943360.0000 22.61 23.5900 22.330
2018/10/22 23.540 13934080.0000 23.86 24.1100 23.300
2018/10/19 23.010 12953670.0000 23.94 23.9499 22.950
2018/10/18 23.330 15580080.0000 23.50 24.1321 23.220
close float64
volume object
open float64
high float64
low float64
dtype: object
-
指定某列为label,通过指定read_csv函数的index_col形参为数据的第一列作为DataFrame的index或label,可将第一列date作为df这个DataFrame的label,避免用自动分配的整型数据作为label。
-
skiprows参数,volume的数据类型是object,很诡异,应该是数值型的数据比较好,所以在读入数据时可以指定相应列的数据类型。由于数据里的第1行的volume是' 3,018,583'这条数据和其下的其他数据的表示形式不一致,所以可以使用skiprows参数忽略这行数据。
import numpy as np
import pandas as pd
df = pd.read_csv("jd.csv", index_col = 0, dtype = {'volume' : np.float64},skiprows=[1])
print df[:5]
print df.dtypes
程序执行结果:
close volume open high low
2018/10/23 23.23 17943360 22.61 23.5900 22.33
2018/10/22 23.54 13934080 23.86 24.1100 23.30
2018/10/19 23.01 12953670 23.94 23.9499 22.95
2018/10/18 23.33 15580080 23.50 24.1321 23.22
2018/10/17 23.68 15368750 24.52 24.6100 23.46
close float64
volume float64
open float64
high float64
low float64
dtype: object
- header参数和names参数,数据里的第0行、第1行数据,一个是各字段名,和当日交易,pandas的read_csv会把第0行作为各个字段的名,也可自己指定字段名,忽略掉第0行的数据。
import numpy as np
import pandas as pd
df = pd.read_csv("jd.csv", index_col = 0, dtype = {'volume' : np.float64},skiprows=[0,1], header = 0, names = ["Close","Volume","Open","High","Low"])
print df[:5]
print df.dtypes
执行结果:
Close Volume Open High Low
2018/10/22 23.54 13934080 23.86 24.1100 23.30
2018/10/19 23.01 12953670 23.94 23.9499 22.95
2018/10/18 23.33 15580080 23.50 24.1321 23.22
2018/10/17 23.68 15368750 24.52 24.6100 23.46
2018/10/16 24.63 11679180 24.50 24.7000 24.08
Close float64
Volume float64
Open float64
High float64
Low float64
dtype: object
- usecols参数,以上的例子是将数据全部读入,也可通过指定usecols参数,读入部分列的数据。
import numpy as np
import pandas as pd
df = pd.read_csv("jd.csv",
skiprows=[1],
usecols = ['date','close', 'volume','open'],
index_col = 0,
dtype = {'volume' : np.float64})
print df[:5]
print df.dtypes
程序执行结果:
close volume open
2018/10/23 23.23 17943360 22.61
2018/10/22 23.54 13934080 23.86
2018/10/19 23.01 12953670 23.94
2018/10/18 23.33 15580080 23.50
2018/10/17 23.68 15368750 24.52
close float64
volume float64
open float64
dtype: object
- read_table函数,pandas里除了read_csv还有read_table函数也可以读取csv文件成DataFrame。
import pandas as pd
df = pd.read_csv("movies.dat", sep = "::",engine='python', index_col = 0)
print df[:5]
movies.dat文件可以从movielen下载,每天记录以::
分割字段,部分内容如下。
1::Toy Story (1995)::Animation|Children's|Comedy
2::Jumanji (1995)::Adventure|Children's|Fantasy
3::Grumpier Old Men (1995)::Comedy|Romance
4::Waiting to Exhale (1995)::Comedy|Drama
5::Father of the Bride Part II (1995)::Comedy
通过read_table读回的数据:
Toy Story (1995) Animation|Children's|Comedy
2 Jumanji (1995) Adventure|Children's|Fantasy
3 Grumpier Old Men (1995) Comedy|Romance
4 Waiting to Exhale (1995) Comedy|Drama
5 Father of the Bride Part II (1995) Comedy
6 Heat (1995) Action|Crime|Thriller
read_csv的nrows参数也很有用,如果数据文件很大,内存很小,读取数据不想全都读回,可以使用nrows函数指定读回的行数。
8.4 DataFrame存成csv
可以使用pandas的to_csv函数将DataFrame数据存储成csv文件。
import pandas as pd
df = pd.DataFrame({'name' : "hello the cruel world".split(),
'growth' : [100, 125, 150, 200]},
index = "jack tom mike nike".split())
print "*"* 10
print df
print "*"* 10
df.to_csv("out.csv", index_label = "index")
- index_lable参数,to_csv函数里的index_label参数是给出index或label列的名字。输出的out.csv文件如下:
index,growth,name
jack,100,hello
tom,125,the
mike,150,cruel
nike,200,world
程序执行结果:
**********
growth name
jack 100 hello
tom 125 the
mike 150 cruel
nike 200 world
**********
8.5 Excel文件创建DataFrame
pandas还可以从Excel文件提取数据创建DateFrame数据,但需要平台支持Excel文件的读写模块,可以安装xlrd或openpyxl模块。
$ sudo pip install xlrd
- read_excel函数读Excel里的数据,将上边jd.csv用excel打开,另存为jd.xls文件,然后用read_excel来读取Excel文件里的数据创建DataFrame。
import pandas as pd
df = pd.read_excel("jd.xls", index_col=0)
print df[:5]
- 可以使用to_excel函数将数据写入Excel文件。
import pandas as pd
idx = list("abcdef")
val1 = range(10, 16)
val2 = range(19, 25)
df1 = pd.DataFrame({"math": val1, "eng" : val2}, index = idx)
print df1
df2 = pd.DataFrame({"chn": val1, "phy" : val2}, index = idx)
print df2
writer = pd.ExcelWriter("record.xls")
df1.to_excel(writer, sheet_name = "me")
df2.to_excel(writer, sheet_name = "cp")
writer.save()
to_excel函数的形参sheet_name指定表单名。
- 读excel里多表单数据,创建DateFrame。上边代码将df1和df2数据写入Excel并生成record.xls文件,这个Excel文件里有两个表单:me和cp,现在用read_excel函数分别从两个表单里读取数据用于创建DataFrame。
import pandas as pd
df1 = pd.read_excel("record.xls", sheetname = "cp", index_col = 0)
print df1
print df1.index
df2 = pd.read_excel("record.xls", sheetname = "me", index_col = 0)
print df2
print df2.index
程序运行时结果:
chn phy
a 10 19
b 11 20
c 12 21
d 13 22
e 14 23
f 15 24
Index([u'a', u'b', u'c', u'd', u'e', u'f'], dtype='object')
eng math
a 19 10
b 20 11
c 21 12
d 22 13
e 23 14
f 24 15
Index([u'a', u'b', u'c', u'd', u'e', u'f'], dtype='object')
8.6 JSON数据创建DataFrame
pandas里提供to_json函数可以将DataFrame数据输出成json格式的数据文件。
import pandas as pd
df3 = pd.read_table("movies.dat", sep = "::",engine='python')
print df3
df3[:500].to_json("movies.json")
print "end"
程序执行完后,生成movies.json文件,可以用pandas的read_json函数将json文件里的数据读回并创建DataFrame数据。
import pandas as pd
df3 = pd.read_json("movies.json")
print df3
8. Pandas的DataFrame创建Pandas的Dataframe是二维的,每一列都是一个Series结构。Dataframe既可以通过列表也可以通过字典方式来创建,而且数据可以导入的方式也是非常多的。8.1 字典数据创建DataFrameDataFrame数据的创建和Series的创建类似,可以有很多方式。和Series一样也有字典类型的方式。字典方式创建DataFr...
之前因为比赛一直在玩
DataFrame,处理一些小型数据感觉很是方便。但是今天遇到了一个3.32G大的
CSV文件感觉甚是无力,总是报内存错误。上网查找了一些方法感觉都很有启发啊,所以自己整合了一下。并记录下来,以防记性不好的我忘记。方法一:with open('C:/Users/asus/Desktop/Python/test.
csv') as f:
for line in f:
pandas创建DataFrame的几种方式
如果你是一个
pandas初学者,那么不知道你会不会像我一样。在学用列表或者数组
创建DataFrame时理不清怎样用数据生成以及想要形状的的
Dataframe,那么,现在,你不用自己琢磨了,我这里给你整理了一下,现在我们就来看看这三种生成
Dataframe的方式。
1.用传入列表或者数组
创建DataFrame
采用列表
创建DataFrame
nums = [[i for i in range(3)] for _ in range(10)]
# 1.
Pandas 的主要数据结构是 Series (一维数据)与
DataFrame(二维数据)
# 2. Series的函数形式和参数形式
# 3.
CSV文件:以纯文本的形式存储表格数据的
文件(包括数字和文本)
# 4.
JSON(存储和交换信息的语法)数据操作操作
# 5. 数据清理
#
DataFrame
# TODO:
pandas.
DataFrame( data, index, columns, dtype, copy)
最近需要将csv文件转成DataFrame并以json的形式展示到前台,故需要用到Dataframe的to_json方法
to_json方法默认以列名为键,列内容为值,形成{col1:[v11,v21,v31…],col2:[v12,v22,v32],…}这种格式,但有时我们需要按行来转为json,形如这种格式[row1:{col1:v11,col2:v12,col3:v13…},row2:{col1:v21,col2:v22,col3:v23…}]
通过查找官网我们可以看到to_json方法有一个参数为orient,其参数说明如下:
orient : string
Series
file_dir="./test.csv"
#读取CSV 文件
result_csv=pd.read_csv(file_path, error_bad_lines=False, encoding='gb18030',engine='python')
#将结果转换成Dataframe格式的数据,Dataframe类似一个表格,columns代表表头的每一列的属性名,我们这里定义的是ABCD四列,注意,这里的A
使用Python向已有Excel工作表sheet写入数据框dataframe数据
项目场景:
通常使用SQL、Python处理完数据后会将需要导出的数据输出成CSV格式,然后必要时使用Excel模板进行格式上的调整(供业务人员查看),或者输入到Excel模板进一步计算,该步骤一般都是人工操作,对Python最后的输出操作优化可以提高一点工作效率。
原有工作簿有两个工作表sheet1,sheet2,sheet1带有格式,需要从Python导出数据往里面写入,sheet2是对sheet1其中两列进行计
pandas是Python的一个数据处理库,提供了类似于Excel表格的DataFrame数据结构,可以方便地进行数据处理和操作。在处理完数据后,我们常常需要将DataFrame保存到文件中,以便后续使用或分享给他人。
pandas提供了多种文件格式用于DataFrame的保存,包括CSV、Excel、JSON、HTML、SQL等。其中,CSV是最常用的文件格式之一,它使用逗号分隔不同的字段,非常方便用Excel或其他工具打开和操作。
我们可以通过DataFrame的to_csv()函数将DataFrame保存为CSV文件。例如,假设我们有一个DataFrame对象df,其中存储了一些数据,要将它保存到名为data.csv的文件中,可以使用以下代码:
```python
df.to_csv('data.csv', index=False)
其中,index=False表示不保存行索引信息,如果要保存行索引信息,可以将index参数设置为True。我们还可以通过sep参数指定字段的分隔符,默认为逗号。例如,如果要将数据保存为分号分隔的文件,可以使用以下代码:
```python
df.to_csv('data.csv', index=False, sep=';')
除了CSV文件,我们还可以将DataFrame保存为Excel文件,用于与其他人分享数据。pandas提供了to_excel()函数用于将DataFrame保存为Excel文件。例如,要将DataFrame保存为名为data.xlsx的Excel文件,可以使用以下代码:
```python
df.to_excel('data.xlsx', index=False)
类似于to_csv()函数,to_excel()函数也可以通过参数控制保存的行列索引等信息。除了CSV和Excel文件,pandas还支持JSON、HTML、SQL等多种不同格式的文件保存,具体使用方法可参考pandas官方文档。
python错误提示---pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the
38470
pycharm连接oracle cx_Oracle.DatabaseError: ORA-12154: TNS:could not resolve the connect identifier....
三川故里丶: