我们知道numpy已经能够帮助我们处理数据,能够结合matplotlib解决我们数据分析的问题,那么pandas学习的目的在什么地方呢?
numpy只能够处理数值型的数据,而pandas还可以处理其他类型的数据。
pandas常用数据类型
pandas的常用数据类型:
series一维,带标签的数据(索引)。
DataFrame二维,Series容器。
创建Series
首先利用字典推导式创建一个字典:
import pandas as pd
import string
import numpy as np
a = {string.ascii_uppercase[i]:i for i in range(10)}
a
输出结果:
{'A': 0,
'B': 1,
'C': 2,
'D': 3,
'E': 4,
'F': 5,
'G': 6,
'H': 7,
'I': 8,
'J': 9}
然后通过字典创建一个Series,其中的索引就是字典中的键。
pd.Series(a)
A 0
B 1
C 2
D 3
E 4
F 5
G 6
H 7
I 8
J 9
dtype: int64
pd.Series的作用就是把传入的数据类型转化为Series结构,
t = pd.Series(np.arange(10),index=list(string.ascii_uppercase[:10]))
t
type(t)
结果一样:
A 0
B 1
C 2
D 3
E 4
F 5
G 6
H 7
I 8
J 9
dtype: int64
pandas.core.series.Series
我们可以重新给数据指定索引,如果能够对应上,就取其值,如果不能则为Nan
pd.Series(a,index=list(string.ascii_uppercase[5:15]))
结果:
F 5.0
G 6.0
H 7.0
I 8.0
J 9.0
K NaN
L NaN
M NaN
N NaN
O NaN
dtype: float64
这里的数据类型为什么变成了float了呢,这是因为NaN是float类型的,pandas会自动根据数据类型更改Series的dtype类型。想要自己修改dtype,方法和numpy中的方法一样。
以上的两种创建Series的方法简单写就是下面的形式:
t2 = pd.Series([1,2,3,4],index=list("abcd"))
t2
temp_list = {"name":"张三","age":18,"tel":10086,"sex":"男"}
t3 = pd.Series(temp_list)
t3
结果为:
t2:
a 1
b 2
c 3
d 4
dtype: int64
t3:
name 张三
age 18
tel 10086
sex 男
dtype: object
Series切片和索引
切片:直接传入start 和 end或者步长即可。
t3[:3]
name 张三
age 18
tel 10086
dtype: object
t3[1:4:2]
age 18
sex 男
dtype: object
索引:一个的时候直接传入序号或者index,多个的时候传入序号或者index列表
t3[[1,2,3]]
age 18
tel 10086
sex 男
dtype: object
t3[["age","tel"]]
输出结果:
age 18
tel 10086
dtype: object
panda取行取列,方括号写数组,表示取行,对行进行操作,方括号写字符串,表示取列,对列进行操作
Series索引和值
对于一个陌生的series类型,我们如何知道他的索引和具体的值呢?
查看索引:
t3.index
结果:
Index(['name', 'age', 'tel', 'sex'], dtype='object')
for i in t3.index:
print(i)
list(t3.index)
len(t3.index)
结果:
name
age
tel
sex
['name', 'age', 'tel', 'sex']
4
查看值:
t3.values
结果:
array(['张三', 18, 10086, '男'], dtype=object)
Series对象本质上是由两个数组构成,一个数组构成对象的键(index,索引),另一个数组构成对象的值(values)。
pandas读取外部数据
读文件中的数据
用pd.read_csv()读取csv文件
import pandas as pd
#pandas读取csv中的文件
df = pd.read_csv("./dogNames2.csv")
#条件选择
print(df[(800<df["Count_AnimalName"])|(df["Count_AnimalName"]<1000)])
打印结果
Row_Labels Count_AnimalName
0 1 1
1 2 2
2 40804 1
3 90201 1
4 90203 1
... ... ...
16215 37916 1
16216 38282 1
16217 38583 1
16218 38948 1
16219 39743 1
[16220 rows x 2 columns]
如果打印前多少行可以用head,例如print(df.head(10))打印前10行。
逆序用df.sort_index(ascending=False)
import pandas as pd
#pandas读取csv中的文件
df = pd.read_csv("./dogNames2.csv")
print(df.sort_index(ascending=False).head(10))
结果:
Row_Labels Count_AnimalName
16219 39743 1
16218 38948 1
16217 38583 1
16216 38282 1
16215 37916 1
16214 37846 1
16213 TRUE 3
16212 ???Y 1
16211 ZZ 2
16210 ZYU 1
读数据库中的数据
pd.read_sql(sql_sentence,connection)用来读取数据库,以mongodb为例,如图是mongodb中的数据
读取数据并打印第一行
# coding=utf-8
from pymongo import MongoClient
import pandas as pd
client = MongoClient()
collection = client["lixing"]["test1000"]
data = list(collection.find())
t1 = data[0]
t1 = pd.Series(t1)
print(t1)
结果:
_id 5d316641f5359b693057ea84
name xiaowang
age 10
dtype: object
pands之DataFrame
DataFrame是二维数值,是Series的容器。
t = pd.DataFrame(np.arange(12).reshape(3,4))
t
结果为:
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
DataFrame对象既有行索引,又有列索引。
行索引,表明不同行,叫index,0轴,axis=0
列索引,表明不同的列,叫columns,1轴,axis=1
指定行索引和列索引:
t = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("wxyz"))
t
w x y z
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
用字典创建
d2 = [{"name":"李四","age":20,"tel":10086},{"name":"王五","age":18},{"name":"张三","age":19,"tel":"10010"}]
d2 = pd.DataFrame(d2)
d2
name age tel
0 李四 20 10086
1 王五 18 NaN
2 张三 19 10010
读取数据库中的数据,转化为DataFrame
from pymongo import MongoClient
import pandas as pd
client = MongoClient()
collection = client["lixing"]["t255"]
data = list(collection.find())
data_list = []
for i in data:
temp = {}
temp["name"] = i["name"]
temp["age"] = i["age"]
data_list.append(temp)
df = pd.DataFrame(data_list)
print(df)
print("#"*20)
print(df.info())
print("#"*20)
print(df.describe())
打印结果:
name age
0 test0 0.0
1 test1 1.0
2 test2 2.0
3 test3 3.0
4 test4 4.0
... ... ...
99995 test99995 99995.0
99996 test99996 99996.0
99997 test99997 99997.0
99998 test99998 99998.0
99999 test99999 99999.0
[100000 rows x 2 columns]
####################
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100000 entries, 0 to 99999
Data columns (total 2 columns):
name 100000 non-null object
age 100000 non-null float64
dtypes: float64(1), object(1)
memory usage: 1.5+ MB
None
####################
age
count 100000.000000
mean 49999.500000
std 28867.657797
min 0.000000
25% 24999.750000
50% 49999.500000
75% 74999.250000
max 99999.000000
DataFrame的基本属性
属性 | 含义 |
---|---|
df.shape | 行数,列数 |
df.dtype | 列数据类型 |
df.ndim | 数据维度 |
df.index | 行索引 |
df.colums | 列索引 |
df.value | 对象值,二维的ndarray数组 |
DataFrame整体情况查询
方法名 | 含义 |
---|---|
df.head(10) | 显示头部几行,默认为5 |
df.tail(10) | 显示末尾几行,默认为5 |
df.info() | 相关信息概述,包括行数,列数,列索引,列非空值个数,列类型,内存占用 |
df.describe() | 快速综合统计结果:计数,均值,标准差,最大值,四分位数,最小值 |
df.sort_value(by=“列名”,ascending=False) | 对某一列的值进行排序,并采用逆序 |
df.sort_index() | 对索引进行排序,ascending=False是逆序,默认不写为正序 |
pandas之loc
1.df.loc:通过标签索引行数据
有DataFrame如下:
t = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("wxyz"))
t
w x y z
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
取某个值:
t.loc["a","z"]#结果为3
取某一行
t.loc["b"]
结果:
w 4
x 5
y 6
z 7
Name: b, dtype: int64
取某一列:
t.loc[:,"y"]
a 2
b 6
c 10
Name: y, dtype: int64
取多行多列:
t.loc[["a","c"],:]
t.loc[:,['y','z']]
t.loc[['a'],['y','z']]
结果:
w x y z
a 0 1 2 3
c 8 9 10 11
y z
a 2 3
b 6 7
c 10 11
y z
a 2 3
2.df.iloc:通过位置获取行数据
通过位置取行
t.iloc[1,:]
w 4
x 5
y 6
z 7
Name: b, dtype: int64
通过位置取多行多列
t.iloc[:,[2,1]]
y x
a 2 1
b 6 5
c 10 9
未完待续