文件读入
Pandas可以将读取到的表格型数据(文件不一定要是表格)转成DataFrame类型的数据结构,然后我们可以通过操作DataFrame进行数据分析,数据预处理以及行和列的操作等。
1、read_csv函数
功能:从文件、URL、文件新对象中加载带有分隔符的数据(无论文件尾缀是什么),默认分隔符是逗号(可以更改参数 sep=",")。
文件形如:
a,b,c,d,name
1,2,3,4,python
5,6,7,8,java
9,10,11,12,c++
使用情形一
data = pd.read_csv("data.txt")
print(data) # 在只含路径参数时,行索引自动数字,列索引默认第一行
'''
a b c d name
0 1 2 3 4 python
1 5 6 7 8 java
2 9 10 11 12 c++
'''
使用情形二
df = pd.read_csv("a.txt", header=None)
print(df)
0 1 2 3 4
0 a b c d name
1 1 2 3 4 python
2 5 6 7 8 java
3 9 10 11 12 c++
import pandas as pd
df = pd.read_csv("a.txt", header=0)
print(df)
a b c d name
0 1 2 3 4 python
1 5 6 7 8 java
2 9 10 11 12 c++
使用情形三
df = pd.read_csv("a.txt", names=["z","x","c","v","b"]) # 分配列索引给表格
print(df)
z x c v b
0 a b c d name
1 1 2 3 4 python
2 5 6 7 8 java
3 9 10 11 12 c++
使用情形四
df = pd.read_csv("a.txt", index_col="name") # 指定原文件的某一列作为行索引
print(df)
a b c d
name
python 1 2 3 4
java 5 6 7 8
c++ 9 10 11 12
使用情形五
df = pd.read_csv("a.txt", nrows=2) # 指定读取文件的行数
print(df)
a b c d name
0 1 2 3 4 python
1 5 6 7 8 java
2.read_excel函数
pd.read_excel(io, sheetname=0,header=0,skiprows=None,index_col=None,names=None)
使用方法和cvs一致。
Padas的简单使用
pandas的两个基本的数据结构之一:Series
- 它是将要介绍的另外一个数据结构的单元数据结构,相当于一个矩阵中的列向量,不过,这个列向量是由另一个相关的索引向量标记的,索引在左边,值在右边;形如:
# 创建默认索引的
obj = pd.Series([2,9,5,6])
obj
Out[4]:
0 2
1 9
2 5
3 6
dtype: int64
# 创建指定索引的
obj2 = pd.Series([3,3,4,4,5],index=['a','b','c','d','e'])
obj2
Out[10]:
a 3
b 3
c 4
d 4
e 5
dtype: int64
# 强制更改索引
obj2.index = ["o","v","c","l"]
没有指定索引,默认是从 0 - N-1。
- 可以通过Series的两个属性,index 和 value 来分别获取索引和值
obj.index
Out[5]: RangeIndex(start=0, stop=4, step=1)
obj.values
Out[7]: array([2, 9, 5, 6], dtype=int64)
- 支持字典式取值,字典式 in 询问
obj2['a']
Out[12]: 3
- 支持字典创建
obj3=pd.Series({"a":1,"b":2,"c":3})
obj3
Out[14]:
a 1
b 2
c 3
dtype: int64
# 如果字典创建的时候,还指定了索引顺序,那么将按照指定的索引排列,可以抛弃某个旧的索引(此条目将丢失),也可以创建新的索引,原来没有将为nan.
obj3=pd.Series({"a":1,"b":2,"c":3},index=["b","a","d"])
obj3
Out[16]:
b 2.0
a 1.0
d NaN
dtype: float64
- 检测是否有nan值
pd.isnull(obj3)
Out[17]:
b False
a False
d True
dtype: bool
- Seriers 在运算时以 索引自动对齐运算
obj2+obj3
Out[19]:
a 4.0
b 5.0
c NaN
d NaN
e NaN
dtype: float64
- Series 索引的 name 和 值的 name(相当于这两个向量的名字)
obj3.name
obj3.name="population"
obj3.index.name="ind"
obj3
Out[23]:
ind
b 2.0
a 1.0
d NaN
Name: population, dtype: float64
pandas的两个基本的数据结构之二:DataFrame
构造DF
- DataFrame是一个典型的表格型数据,既有行索引,又有列索引。可以看成是,一个大字典,字典的键是 列索引,字典的值是一个Series; 构成这些索引的每一个值的Series都是共用一个 Series 索引的。
data = {"cities":["bj","bj","bj","bj"],
"year":[2001,2002,2003,2004],
"popular":[8,9,10,11]}
df = pd.DataFrame(data)
df
Out[34]:
cities year popular
0 bj 2001 8
1 bj 2002 9
2 bj 2003 10
3 bj 2004 11
# 和serries一样(通过字典创建时指定index),Dataframe 创建的时候可以指定columns
df1 = pd.DataFrame(data,columns=["year","popular","new"])
df1
Out[36]:
year popular new
0 2001 8 NaN
1 2002 9 NaN
2 2003 10 NaN
3 2004 11 NaN
''' 也可以用字典的字典创建'''
data = {"cities":{2001:"bj",2002:"bj",2003:"bj"}, "money":{2004:20000,2002:10000,2003:1500}}
df3 = pd.DataFrame(data)
df3
Out[48]:
cities money
2001 bj NaN
2002 bj 10000.0
2003 bj 1500.0
2004 NaN 20000.0
- DataFrame 默认通过 列索引获取一个series;(在series中默认通过索引获取一个值)
df["popular"] 或者 df.popular
Out[37]:
0 8
1 9
2 10
3 11
Name: popular, dtype: int64
- DataFrame 通过 ix 间接获取行向量,行向量也是一个series,它的索引是原来DF的列索引。
df.loc[2]
Out[40]:
cities bj
year 2003
popular 10
Name: 2, dtype: object
- 列可以通过直接赋值的方式修改
df["popular"]=2
df
Out[43]:
cities year popular
0 bj 2001 2
1 bj 2002 2
2 bj 2003 2
3 bj 2004 2
- DateFrame中产生新的列,就是为不存在的列名赋值即可
df["my_add"]=[1,1,4,5]
df
Out[45]:
cities year popular my_add
0 bj 2001 2 1
1 bj 2002 2 1
2 bj 2003 2 4
3 bj 2004 2 5
- 注意,DF中通过索引返回的series都是视图,一切的修改都会反映到DF上面。
- DF的转置,很简单,就是行变成列,列变成行。
df3
Out[48]:
cities money
2001 bj NaN
2002 bj 10000.0
2003 bj 1500.0
2004 NaN 20000.0
df3.T
Out[49]:
2001 2002 2003 2004
cities bj bj bj NaN
money NaN 10000 1500 20000
除了这些常用的构造DF方法外,DataFrame还可以接收 (二维数组,numpy二维数组)
DF的基本功能
- 和series一样设置 index 与 columns 的name属性 值
df.index.name="index_"
df.columns.name="rrr"
df
Out[52]:
rrr cities year popular my_add
index_
0 bj 2001 2 1
1 bj 2002 2 1
2 bj 2003 2 4
3 bj 2004 2 5
- 与series一样,values属性返回 二维表的值
df.values
Out[53]:
array([['bj', 2001, 2, 1],
['bj', 2002, 2, 1],
['bj', 2003, 2, 4],
['bj', 2004, 2, 5]], dtype=object)
- index对象,轴标签(就是DF的行标签)
index一旦设定不可更改
df3
Out[55]:
cities money
2001 bj NaN
2002 bj 10000.0
2003 bj 1500.0
2004 NaN 20000.0
df3.index
Out[56]: Int64Index([2001, 2002, 2003, 2004], dtype='int64')
- 重新索引 reindex 功能
由于索引 index 不可更改,所以,这个方法将创建一个适应新索引的 新的 DF对象
df3
Out[55]:
cities money
2001 bj NaN
2002 bj 10000.0
2003 bj 1500.0
2004 NaN 20000.0
df4=df3.reindex([2011,2002,2003])
df4
Out[60]:
cities money
2011 NaN NaN
2002 bj 10000.0
2003 bj 1500.0
注意,如果新的索引以前不存在,将默认nan,不过可以在 reinde 中用 fill_value 参数指定nan为其他数值。method参数可以指定像前或向后插值填充。
- reindex 默认“修改” 行索引,通过参数columns=[ ];修改列索引
Out[61]:
cities money
2001 bj NaN
2002 bj 10000.0
2003 bj 1500.0
2004 NaN 20000.0
df3.reindex(columns=["yingtan","nanchang"])
Out[62]:
yingtan nanchang
2001 NaN NaN
2002 NaN NaN
2003 NaN NaN
2004 NaN NaN
注意,可以同时在reindex中利用 index=[ ] , columns= [ ];对行列同时重新索引。
- 丢弃指定轴上的项(可以用reindex,整体选择留下来的df新对象,也可以用drop来生成一个删除特定项的新df对象)
df3
Out[63]:
cities money
2001 bj NaN
2002 bj 10000.0
2003 bj 1500.0
2004 NaN 20000.0
df_0 = df3.drop([2002])
df_0
Out[66]:
cities money
2001 bj NaN
2003 bj 1500.0
2004 NaN 20000.0
注意dorp默认是drop行的数据,如果需要drop列的数据,加参数 axis=1
p130