1.DataFrame
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。
DataFrame可以通过类似字典的方式或者.columnname的方式将列获取为一个Series。行也可以通过位置或名称的方式进行获取。
为不存在的列赋值会创建新列。
1.1创建DataFrame
pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
1
data:numpy ndarray(结构化或同类),dict或DataFrame,Dict可以包含Series,数组,常量或类似列表的对象
index:dataframe的索引,如果没有自定义,则默认为RangeIndex(0,1,2,…,n)
columns:dataframe的列标签,如果没有自定义,则默认为RangeIndex(0,1,2,…,n)
dtype:默认None,要强制的数据类型。 只允许一个dtype
copy:boolean,默认为False
1.2读取文件
读取csv文件dfcsv = pd.DataFrame(pd.read_csv("name"))
读取excel文件dfexcel = pd.DataFrame(pd.read_excel("name"))
读取mysql数据库文件:需要用到sqlalchemy 和pymysql包
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://root:123456@localhost:3306/classicmodels")
sql = "select * from customers"
dfsql = pd.read_sql_query(sql,engine)
dfsql
1
2
3
4
5
6
root >> 服务器名称
123456 >> 数据库服务器密码
localhost:3306 >> 数据库地址
classicmodels >> 数据库名称
1
2
3
4
1.3查看数据的维度
df.shape #输出行数、列数
dfexcel.shape
(326, 7)
1
2
3
4
1.4查看数据表基本信息
dfexcel.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 326 entries, 0 to 325
Data columns (total 7 columns):
订单编码 326 non-null int64
订单日期 326 non-null datetime64[ns]
要求发货日期 326 non-null datetime64[ns]
实际发货日期 312 non-null datetime64[ns]
订单状态 326 non-null object
备注 80 non-null object
顾客编码 326 non-null int64
dtypes: datetime64[ns](3), int64(2), object(2)
memory usage: 17.9+ KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
dfsql.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20 entries, 0 to 19
Data columns (total 6 columns):
订单编码 20 non-null int64
产品编码 20 non-null object
订购数量 20 non-null int64
单价 20 non-null float64
订单子编码 20 non-null int64
订单金额 20 non-null float64
dtypes: float64(2), int64(3), object(1)
memory usage: 1.0+ KB
1
2
3
4
5
6
7
8
9
10
11
12
1.5获取表、列数据
frame
frame[‘col1’]
frame.col1
dfexcel
dfexcel.订单日期
dfexcel["订单日期"]
1
2
3
1.6查看空值
dfexcel.isnull()
dfexcel["col1"].isnull()
dfexcel["订单日期"].isnull()
1
2
3
1.7查看唯一值
dfexcel["col1"].unique()
dfexcel["订单日期"].unique()
1
2
1.8查看表列名
dfexcel.columns
1
1.9查看前N行、后N行数据
dfexcel.head(10)
dfexcel.tail(10)
1
2
1.10添加列
1.10.1用eval函数添加计算列
inplace参数为是否替代当前DataFrame,默认为false
dfsql.eval("订单金额 = 订购数量 * 单价 ",inplace = True)
dfsql.columns
Index(['订单编码', '产品编码', '订购数量', '单价', '订单子编码', '订单金额'], dtype='object')
1
2
3
一次添加多个计算列时
dfsql.eval("""订单金额 = 订购数量 * 单价
订购数量1 = 订购数量
单价1 = 单价
""",inplace = True);
dfsql.columns
Index(['订单编码', '产品编码', '订购数量', '单价', '订单子编码', '订单金额', '订购数量1', '单价1'], dtype='object')
1
2
3
4
5
6
1.10.2 用insert函数插入列
DataFrame.insert("location", new_name_column, value_inserted_column)
location:插入的索引位置,从0开始
new_name_column:新列名称
value_inserted_column:新列值
ins1 = dfsql.pop("订单金额"); #删除之前eval插入的计算列
print(dfsql.columns)
Index(['订单编码', '产品编码', '订购数量', '单价', '订单子编码', '订单金额', '订购数量1', '单价1'], dtype='object')
dfsql.insert(4,"订单金额",ins1) #在第4索引列插入新列
print(dfsql.columns)
Index(['订单编码', '产品编码', '订购数量', '单价', '订单金额', '订单子编码', '订购数量1', '单价1'], dtype='object')
1
2
3
4
5
6
7
1.11删除行列数据
1.11.1用pop函数
先看下官方文档介绍 >>>戳我看原链接
pandas的Github源码
DataFrame.pop(item)
从frame里删除项目并返回. 如果不存在则返回KeyError错误.
参数:item : str格式,要被删除的列标签(column label直译的。应该是列名称的意思)
返回值:已删除的series
以上面的数据库dfsql为例
print(dfsql.columns)
Index(['订单编码', '产品编码', '订购数量', '单价', '订单金额', '订单子编码'], dtype='object')
dfsql.eval("订单金额 = 订购数量 * 单价",inplace = True) #先添加一列订单金额.
print(dfsql)
订单编码 产品编码 订购数量 单价 订单子编码 订单金额
0 10100 S18_1749 30 136.00 3 4080.00
1 10100 S18_2248 50 55.09 2 2754.50
2 10100 S18_4409 22 75.46 4 1660.12
3 10100 S24_3969 49 35.29 1 1729.21
4 10101 S18_2325 25 108.06 4 2701.50
5 10101 S18_2795 26 167.06 1 4343.56
6 10101 S24_1937 45 32.53 3 1463.85
7 10101 S24_2022 46 44.35 2 2040.10
8 10102 S18_1342 39 95.55 2 3726.45
9 10102 S18_1367 41 43.13 1 1768.33
10 10103 S10_1949 26 214.30 11 5571.80
11 10103 S10_4962 42 119.67 4 5026.14
12 10103 S12_1666 27 121.64 8 3284.28
13 10103 S18_1097 35 94.50 10 3307.50
14 10103 S18_2432 22 58.34 2 1283.48
15 10103 S18_2949 27 92.19 12 2489.13
16 10103 S18_2957 35 61.84 14 2164.40
17 10103 S18_3136 25 86.92 13 2173.00
print(dfsql.pop("订单金额"))
0 4080.00
1 2754.50
2 1660.12
3 1729.21
4 2701.50
5 4343.56
6 1463.85
7 2040.10
8 3726.45
9 1768.33
10 5571.80
11 5026.14
12 3284.28
13 3307.50
14 1283.48
15 2489.13
16 2164.40
17 2173.00
Name: 订单金额, dtype: float64
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
1.12.2 用del函数
del frame[‘col1’]
del frame.col1
del dfexcel.订单日期
1
1.12.3用drop函数
pandas.DataFrame.drop官方文档 >>>戳我点链接
DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors=‘raise’)
函数作用:从行或列删除指定标签。Drop specified labels from rows or columns.
通过指定的标签名字和对应的轴,或者直接指定索引名称或列名称来删除行或者列。
下面这句介绍每太搞清楚到底是何意思。
When using a multi-index, labels on different levels can be removed by
specifying the level.
参数介绍:
参数名称 含义 介绍
labels 单独的标签或者类似的list 要删除的索引或者列标签
axis 0或者索引名称,1或者列名称 ,默认为0 确定从索引(或者axis = 0)还是列(或者axis = 1)删除标签
index / columns 单个标签或者类似list 标签值,axis = 1 等同于columns = 列名称(也就是前两个参数等同于第三个参数)
level int or level name optional(没搞懂,反正可有可无。手动滑稽脸) For MultiIndex, level from which the labels will be removed.
inplace 布尔值,默认false 如果为True,就在原数据上执行删除操作,不返回任何值
errors {‘ignore’, ‘raise’}, default ‘raise’ If ‘ignore’, suppress error and only existing labels are dropped.
返回值:
已删除的pandas.DataFrame
Raises:
如果标签不存在指定的轴上,返回KeyError
print(dfsql.columns)
Index(['订单编码', '产品编码', '订购数量', '单价', '订单子编码'], dtype='object')
dfsql.eval("订单金额 = 订购数量 * 单价",inplace = True)
print(dfsql.columns)
Index(['订单编码', '产品编码', '订购数量', '单价', '订单子编码', '订单金额'], dtype='object')
dfsql.drop(["订单金额"],axis = 1)
订单编码 产品编码 订购数量 单价 订单子编码
0 10100 S18_1749 30 136.00 3
1 10100 S18_2248 50 55.09 2
2 10100 S18_4409 22 75.46 4
3 10100 S24_3969 49 35.29 1
4 10101 S18_2325 25 108.06 4
5 10101 S18_2795 26 167.06 1
6 10101 S24_1937 45 32.53 3
7 10101 S24_2022 46 44.35 2
8 10102 S18_1342 39 95.55 2
9 10102 S18_1367 41 43.13 1
10 10103 S10_1949 26 214.30 11
11 10103 S10_4962 42 119.67 4
12 10103 S12_1666 27 121.64 8
13 10103 S18_1097 35 94.50 10
14 10103 S18_2432 22 58.34 2
15 10103 S18_2949 27 92.19 12
16 10103 S18_2957 35 61.84 14
17 10103 S18_3136 25 86.92 13
18 10103 S18_3320 46 86.31 16
19 10103 S18_4600 36 98.07 5
dfsql.drop(columns = ["订单金额"])
# dfsql.drop(["订单金额"],axis = 1)等同于dfsql.drop(columns = ["订单金额"])
订单编码 产品编码 订购数量 单价 订单子编码
0 10100 S18_1749 30 136.00 3
1 10100 S18_2248 50 55.09 2
2 10100 S18_4409 22 75.46 4
3 10100 S24_3969 49 35.29 1
4 10101 S18_2325 25 108.06 4
5 10101 S18_2795 26 167.06 1
6 10101 S24_1937 45 32.53 3
7 10101 S24_2022 46 44.35 2
8 10102 S18_1342 39 95.55 2
9 10102 S18_1367 41 43.13 1
10 10103 S10_1949 26 214.30 11
11 10103 S10_4962 42 119.67 4
12 10103 S12_1666 27 121.64 8
13 10103 S18_1097 35 94.50 10
14 10103 S18_2432 22 58.34 2
15 10103 S18_2949 27 92.19 12
16 10103 S18_2957 35 61.84 14
17 10103 S18_3136 25 86.92 13
18 10103 S18_3320 46 86.31 16
19 10103 S18_4600 36 98.07 5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
2.pandas.date_range()
2.1语法
pandas.date_range(start=None, end=None, periods=None, freq=‘D’,tz=None, normalize=False, name=None, closed=None)
该函数主要用于生成一个固定频率的时间索引,在调用构造方法时,必须指定start、end、periods中的两个参数值,否则报错。
2.2主要参数说明
start:开始日期,例如:‘20180101’,‘01/01/2018’
end:结束日期
periods:固定时期,取值为整数或None;
freq:日期偏移量,取值为string或DateOffset,默认为’D’,还有’M’,‘Q’,‘Y’
normalize:若参数为True表示将start、end参数值规范化到午夜时间20180101 00:00:00
name:生成时间索引对象的名称,取值为string或None
closed:可以理解成在closed=None情况下返回的结果中,若closed=‘left’表示在返回的结果基础上,再取左开右闭的结果,若closed='right’表示在返回的结果基础上,再取做闭右开的结果
示例:date_range = pd.date_range('20180101', periods=10, freq='D')
输出:DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04', '2018-01-05', '2018-01-06', '2018-01-07', '2018-01-08','2018-01-09', '2018-01-10'],dtype='datetime64[ns]', freq='D')
1
2
参数 说明
D 天
B 工作日
MS 月第一天
BMS 月第一个工作日
M 月最后一天
BM 月最后一个工作日
Q 季度末
Y 年末
H 小时
min 分钟
S 秒
W-MON、W-TUE 每周,并指定每周从周几开始
---------------------
转载,仅作分享,侵删
作者:龙小马
原文:https://blog.csdn.net/wuhuideluori/article/details/85338819
|
|