数据分析之利刃之Pandas(一)


我们知道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

未完待续


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值