数据处理
数据加载
首先,我们需要将收集的数据加载到内存中,才能进行进一步的操作。pandas提供了非常多的读取数据的函数,分别应用在各种数据源环境中,我们常用的函数为:
- read_csv
- read_table
- read_sql
说明:
- read_csv与read_table默认使用的分隔符不同。
常用参数
read_csv与read_table常用的参数:
- sep / delimiter
- header
- names
- index_col
- usecols
import numpy as np
import pandas as pd
# 从csv中加载数据(返DateFrame类型)
# 默认将首行作为标题(即列索引) header=None指定无标题
# read_csv与read_table功能相同,只是默认的分隔符不同。
# 对于read_csv,默认分隔符为逗号
# read_table,默认分隔符为制表符(\t)。
# 可以在读取之后,通过colums设置(修改)列标签,也可以在读取时通过names参数指定
# index_col 当数据表中的某一列(某几列)可以作为唯一标记,我们就不用再去生成单独的行索引(行标签)。
# 通过usecols指定加载哪些列
df = pd.read_csv(filepath_or_buffer="spider.csv",
header=None,
sep=',',
names=["date","url","info","value1","value2"],
usecols=['date','url','info'])
display(df.head(10))
# df.columns = ["date","url","info","v1","v2"]
# 随机抽取10条数据
display(df.sample(10))
date | url | info | |
---|---|---|---|
0 | 2015-4-28 | http://www.apinpai.com/ | 采蘑菇的小姑娘;小蓓蕾组合;90;儿歌 |
1 | 2015-8-24 | http://www.apinpai.com/ | 我;张国荣;80;励志 |
2 | 2015-12-14 | http://www.movie.com/dor/ | 《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影... |
3 | 2015-4-2 | http://bj.qu114.com/ | my way;张敬轩;90;励志 |
4 | 2015-12-19 | http://www.movie.com/dor/ | 《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三... |
5 | 2015-5-28 | http://www.favolist.com/ | 屋顶;温岚;80;励志 |
6 | 2015-8-1 | http://www.apinpai.com/ | 小兔子乖乖;小蓓蕾组合;90;儿歌 |
7 | 2015-8-6 | http://www.99inf.com/ | 光辉岁月;beyond;80;励志 |
8 | 2015-6-28 | http://www.qudee.com/ | 逃脱;李玟;90;伤感 |
9 | 2015-8-7 | http://www.alifenfen.com/ | 星;邓丽君;80;励志 |
date | url | info | |
---|---|---|---|
1377 | 2015-5-10 | http://www.010y.com/ | 感恩的心;欧阳菲菲;90;励志 |
514 | 2015-3-12 | http://bj.qu114.com/ | 给所有知道我名字的人;赵传;80;励志 |
235 | 2015-5-13 | http://www.99inf.com/ | 借我;谢春花;90;伤感 |
605 | 2015-6-8 | http://www.wuhan58.com/index.php | 来来回回;陈楚生&spy.c;90;伤感 |
1047 | 2015-12-22 | http://www.movie.com/bor/ | 《闯入者》;2015.4.30;2015.5.24;冬春文化、银润传媒、合润传媒、安乐电影、... |
735 | 2015-8-16 | http://bj.454.cn/ | 来来回回;陈楚生&spy.c;90;伤感 |
168 | 2015-8-10 | http://www.yifawang.cn/ | 我心是海洋;蔡琴;80;励志 |
685 | 2015-3-9 | http://www.yifawang.cn/ | 采蘑菇的小姑娘;小蓓蕾组合;90;儿歌 |
1156 | 2015-7-23 | http://bj.qu114.com/ | 我心是海洋;蔡琴;80;励志 |
175 | 2015-12-7 | http://www.movie.com/bor/12386/ | 《前任2:备胎反击战》;2015.11.6;2015.12.20;华谊兄弟传媒股份有限公司、... |
# 从数据库加载数据(返DateFrame类型)
import pymysql
conn = pymysql.connect(user="root",host="localhost",port=3306,db="test",password="mysql")
df = pd.read_sql("select * from credit_score",conn,index_col="id")
display(df.sample(10))
com_name | com_code | total_score | base_score | achievement | punish_01 | punish_02 | reward | info_01 | info_02 | |
---|---|---|---|---|---|---|---|---|---|---|
id | ||||||||||
3344 | 上海浦东施湾建筑安装工程有限公司 | 13355356-5 | 67.4 | 35.0 | 0.4 | 20.0 | 5.0 | 0.0 | 5.0 | 2.0 |
19484 | 上海浩畅建设工程有限公司 | 69294402-8 | 68.0 | 35.0 | 0.0 | 20.0 | 5.0 | 0.0 | 5.0 | 3.0 |
18028 | 上海景行市政工程有限公司 | 58062646-3 | 67.2 | 35.0 | 0.2 | 20.0 | 5.0 | 0.0 | 5.0 | 2.0 |
18519 | 浙江振华建设有限公司 | 69360526-3 | 67.0 | 35.0 | 0.0 | 20.0 | 5.0 | 0.0 | 5.0 | 2.0 |
8211 | 盐城市兴达建筑工程有限公司 | 14034250-4 | 67.0 | 35.0 | 0.0 | 20.0 | 5.0 | 0.0 | 5.0 | 2.0 |
6262 | 弘衍信息科技(上海)有限公司 | 06257617-9 | 67.0 | 35.0 | 0.0 | 20.0 | 5.0 | 0.0 | 5.0 | 2.0 |
7892 | 上海如虎建筑工程有限公司 | MA1K21J3-6 | 67.0 | 35.0 | 0.0 | 20.0 | 5.0 | 0.0 | 5.0 | 2.0 |
20650 | 广东松本绿色新材股份有限公司 | 69478043-4 | 67.0 | 35.0 | 0.0 | 20.0 | 5.0 | 0.0 | 5.0 | 2.0 |
1697 | 歌山建设集团有限公司 | 70458321-6 | 69.0 | 35.0 | 0.0 | 20.0 | 5.0 | 2.0 | 5.0 | 2.0 |
18888 | 盐城市嘉成机械设备安装有限公司 | 68831080-7 | 68.0 | 35.0 | 0.0 | 20.0 | 5.0 | 0.0 | 5.0 | 3.0 |
写入文件
DataFrame与Series对象的to_csv方法:
- to_csv
该方法可以将数据写入:
- 文件中
- 数据流中
常用参数
- sep
- header 是否写入标题行(列索引)
- na_rep 空值的表示
- index 是否写入索引(行索引)
- index_label 索引字段的名称(行索引名称)
- columns 写入的字段
# 将DateFrame或Series对象写入文件
df = pd.DataFrame([[1,2,3],[4,5,np.NaN]])
display(df)
# sep指定数据分隔符,默认逗号
# header指定是否写入标题,默认True
# 空值默认空格
df.to_csv("save.csv",
sep=",",
header=False,
na_rep="空值",
index=False,
columns=[0,1])
0 | 1 | 2 | |
---|---|---|---|
0 | 1 | 2 | 3.0 |
1 | 4 | 5 | NaN |
# 可以写到数据流当中
df = pd.DataFrame([[1,2,3],[4,5,6]])
# StringIO是Python中提供的类文件对象。【类文件对象:就是像文件对象那样,能够调用read,write,tell等方法的对象。】
from io import StringIO
sio = StringIO()
# 向类文件对象(缓存区)中写入数据
df.to_csv(sio)
# 读取类文件对象的内容
sio.getvalue()
# 调整指针到文件开头
sio.seek(0)
sio.read()
',0,1,2\r\n0,1,2,3\r\n1,4,5,6\r\n'
数据清洗
我们需要对数据进行一些预处理操作,才能用到后续的数据分析与机器学习中。这是因为,无论数据的来源为何处,我们都不可能保证数据一定是准确无误的。
数据清洗可以包含以下几方面内容:
- 处理缺失值
- 处理异常值
- 处理重复值
缺失值处理
发现缺失值
Pandas中,会将float类型的nan与None视为缺失值,我们可以通过如下方法来检测缺失值:
- info
- isnull
- notnull
说明:
- 判断是否存在空值,可以将isnull与any或all结合使用。
丢弃缺失值
对于缺失值,我们可以将其进行丢弃处理(dropna)。
说明:
- how:指定dropna丢弃缺失值的行为,默认为any。
- axis:指定丢弃行或者丢弃列(默认为丢弃行)。
- thresh:当非空数值达到该值时,保留数据,否则删除。
- inplace:指定是否就地修改,默认为False。
- subset:删除空值时,其他轴方向考虑的标签子集。
填充缺失值
我们也可以对缺失值进行填充(fillna)。
说明:
- value:填充所使用的值。可以是一个字典,这样就可以为DataFrame的不同列指定不同的填充值。
- method:指定前值(上一个有效值)填充(pad / ffill),还是后值(下一个有效值)填充(backfill / bfill)。
- limit:如果指定method,表示最大连续NaN的填充数量,如果没有指定method,则表示最大的NaN填充数量。
- inplace:指定是否就地修改,默认为False。
df = pd.read_csv("spider.csv",header=None)
# 显示DateFrame信息
df.info()
print("-"*20)
print(df[3].isnull().any())
print(df[0].notnull().all())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1396 entries, 0 to 1395
Data columns (total 5 columns):
0 1396 non-null object
1 1396 non-null object
2 1396 non-null object
3 1098 non-null float64
4 1098 non-null float64
dtypes: float64(2), object(3)
memory usage: 54.7+ KB
--------------------
True
True
# 丢弃缺失值,默认含有缺失值就删
# axis指定按行或按列,默认按行
df.dropna(how="any").info()
# df.dropna(axis=1) # 按列删除
display(df.dropna(thresh=4))
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1098 entries, 0 to 1395
Data columns (total 5 columns):
0 1098 non-null object
1 1098 non-null object
2 1098 non-null object
3 1098 non-null float64
4 1098 non-null float64
dtypes: float64(2), object(3)
memory usage: 51.5+ KB
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
0 | 2015-4-28 | http://www.apinpai.com/ | 采蘑菇的小姑娘;小蓓蕾组合;90;儿歌 | 216.0 | 1392.68 |
1 | 2015-8-24 | http://www.apinpai.com/ | 我;张国荣;80;励志 | 273.0 | 1447.17 |
3 | 2015-4-2 | http://bj.qu114.com/ | my way;张敬轩;90;励志 | 52.0 | 337.27 |
5 | 2015-5-28 | http://www.favolist.com/ | 屋顶;温岚;80;励志 | 217.0 | 903.29 |
6 | 2015-8-1 | http://www.apinpai.com/ | 小兔子乖乖;小蓓蕾组合;90;儿歌 | 184.0 | 473.07 |
... | ... | ... | ... | ... | ... |
1391 | 2015-7-31 | http://beijing.faxinxi.cn/ | 同道中人;张国荣;80;励志 | 87.0 | 927.30 |
1392 | 2015-4-20 | http://www.denghuo.com/ | 忘记拥抱;a-lin;80;伤感 | 31.0 | 684.56 |
1393 | 2015-4-2 | http://www.yifawang.cn/ | 路...一直都在;陈奕迅;90;励志 | 47.0 | 1419.74 |
1394 | 2015-4-15 | http://www.wuhan58.com/index.php | 像我一样骄傲;赵传;80;励志 | 124.0 | 1434.67 |
1395 | 2015-5-16 | http://www.favolist.com/ | 最冷一天;陈奕迅;90;伤感 | 103.0 | 1020.50 |
1098 rows × 5 columns
# inplace 指定是否就地修改。默认值为False
# df.dropna(inplace=True)
# display(df)
# subset 指定需要考虑的标签
df.dropna(axis=0, subset=[2,3,4],how="all")
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
0 | 2015-4-28 | http://www.apinpai.com/ | 采蘑菇的小姑娘;小蓓蕾组合;90;儿歌 | 216.0 | 1392.68 |
1 | 2015-8-24 | http://www.apinpai.com/ | 我;张国荣;80;励志 | 273.0 | 1447.17 |
2 | 2015-12-14 | http://www.movie.com/dor/ | 《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影... | NaN | NaN |
3 | 2015-4-2 | http://bj.qu114.com/ | my way;张敬轩;90;励志 | 52.0 | 337.27 |
4 | 2015-12-19 | http://www.movie.com/dor/ | 《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三... | NaN | NaN |
... | ... | ... | ... | ... | ... |
1391 | 2015-7-31 | http://beijing.faxinxi.cn/ | 同道中人;张国荣;80;励志 | 87.0 | 927.30 |
1392 | 2015-4-20 | http://www.denghuo.com/ | 忘记拥抱;a-lin;80;伤感 | 31.0 | 684.56 |
1393 | 2015-4-2 | http://www.yifawang.cn/ | 路...一直都在;陈奕迅;90;励志 | 47.0 | 1419.74 |
1394 | 2015-4-15 | http://www.wuhan58.com/index.php | 像我一样骄傲;赵传;80;励志 | 124.0 | 1434.67 |
1395 | 2015-5-16 | http://www.favolist.com/ | 最冷一天;陈奕迅;90;伤感 | 103.0 | 1020.50 |
1396 rows × 5 columns
# 填充缺失值
display(df)
# df.fillna(value=999) # 填充所有的缺失值
# df.fillna(value={3:-1000,4:1000}) # 第三列填充-1000 第四列填充1000
df.fillna(value={3:df[3].mean(),4:df[4].mean()}) # 用对应列平均值填充
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
0 | 2015-4-28 | http://www.apinpai.com/ | 采蘑菇的小姑娘;小蓓蕾组合;90;儿歌 | 216.0 | 1392.68 |
1 | 2015-8-24 | http://www.apinpai.com/ | 我;张国荣;80;励志 | 273.0 | 1447.17 |
2 | 2015-12-14 | http://www.movie.com/dor/ | 《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影... | NaN | NaN |
3 | 2015-4-2 | http://bj.qu114.com/ | my way;张敬轩;90;励志 | 52.0 | 337.27 |
4 | 2015-12-19 | http://www.movie.com/dor/ | 《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三... | NaN | NaN |
... | ... | ... | ... | ... | ... |
1391 | 2015-7-31 | http://beijing.faxinxi.cn/ | 同道中人;张国荣;80;励志 | 87.0 | 927.30 |
1392 | 2015-4-20 | http://www.denghuo.com/ | 忘记拥抱;a-lin;80;伤感 | 31.0 | 684.56 |
1393 | 2015-4-2 | http://www.yifawang.cn/ | 路...一直都在;陈奕迅;90;励志 | 47.0 | 1419.74 |
1394 | 2015-4-15 | http://www.wuhan58.com/index.php | 像我一样骄傲;赵传;80;励志 | 124.0 | 1434.67 |
1395 | 2015-5-16 | http://www.favolist.com/ | 最冷一天;陈奕迅;90;伤感 | 103.0 | 1020.50 |
1396 rows × 5 columns
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
0 | 2015-4-28 | http://www.apinpai.com/ | 采蘑菇的小姑娘;小蓓蕾组合;90;儿歌 | 216.000000 | 1392.680000 |
1 | 2015-8-24 | http://www.apinpai.com/ | 我;张国荣;80;励志 | 273.000000 | 1447.170000 |
2 | 2015-12-14 | http://www.movie.com/dor/ | 《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影... | 143.082878 | 1017.034235 |
3 | 2015-4-2 | http://bj.qu114.com/ | my way;张敬轩;90;励志 | 52.000000 | 337.270000 |
4 | 2015-12-19 | http://www.movie.com/dor/ | 《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三... | 143.082878 | 1017.034235 |
... | ... | ... | ... | ... | ... |
1391 | 2015-7-31 | http://beijing.faxinxi.cn/ | 同道中人;张国荣;80;励志 | 87.000000 | 927.300000 |
1392 | 2015-4-20 | http://www.denghuo.com/ | 忘记拥抱;a-lin;80;伤感 | 31.000000 | 684.560000 |
1393 | 2015-4-2 | http://www.yifawang.cn/ | 路...一直都在;陈奕迅;90;励志 | 47.000000 | 1419.740000 |
1394 | 2015-4-15 | http://www.wuhan58.com/index.php | 像我一样骄傲;赵传;80;励志 | 124.000000 | 1434.670000 |
1395 | 2015-5-16 | http://www.favolist.com/ | 最冷一天;陈奕迅;90;伤感 | 103.000000 | 1020.500000 |
1396 rows × 5 columns
# method:邻近值填充(趋势数据)(ffill/bfill:前值/后值)
df.fillna(method="ffill")
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
0 | 2015-4-28 | http://www.apinpai.com/ | 采蘑菇的小姑娘;小蓓蕾组合;90;儿歌 | 216.0 | 1392.68 |
1 | 2015-8-24 | http://www.apinpai.com/ | 我;张国荣;80;励志 | 273.0 | 1447.17 |
2 | 2015-12-14 | http://www.movie.com/dor/ | 《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影... | 273.0 | 1447.17 |
3 | 2015-4-2 | http://bj.qu114.com/ | my way;张敬轩;90;励志 | 52.0 | 337.27 |
4 | 2015-12-19 | http://www.movie.com/dor/ | 《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三... | 52.0 | 337.27 |
... | ... | ... | ... | ... | ... |
1391 | 2015-7-31 | http://beijing.faxinxi.cn/ | 同道中人;张国荣;80;励志 | 87.0 | 927.30 |
1392 | 2015-4-20 | http://www.denghuo.com/ | 忘记拥抱;a-lin;80;伤感 | 31.0 | 684.56 |
1393 | 2015-4-2 | http://www.yifawang.cn/ | 路...一直都在;陈奕迅;90;励志 | 47.0 | 1419.74 |
1394 | 2015-4-15 | http://www.wuhan58.com/index.php | 像我一样骄傲;赵传;80;励志 | 124.0 | 1434.67 |
1395 | 2015-5-16 | http://www.favolist.com/ | 最冷一天;陈奕迅;90;伤感 | 103.0 | 1020.50 |
1396 rows × 5 columns
无效值处理
检测无效值
可以通过DataFrame对象的describe方法查看数据的统计信息。不同类型的列,统计信息也不太相同。
# 查看DateFrame对象的统计信息
# 如果DataFrame中存在数值列,则数值列会进行统计(非数值列不会统计。)
# 如果DataFrame中不存在数值列,则非数值列会进行统计。
# 数值列与非数值列统计的信息是不同的。
# count:记入统计的数量 mean:平均值 std:标准差 min:最小值 25%:1/4的值小于(50%、75%同理)max:最大值
display(df.describe())
# count:记入统计的数量 unique:唯一值的数量 top:出现次数最多的 freq:出现次数最多的次数
display(df[[0,1,2]].describe())
# 第三列大于0小于一百的保留
# df = df[(df[3]>=0) & (df[3]<=100)]
# display(df)
3 | 4 | |
---|---|---|
count | 1098.000000 | 1098.000000 |
mean | 143.082878 | 1017.034235 |
std | 80.803922 | 550.759464 |
min | 6.000000 | 51.390000 |
25% | 73.250000 | 555.042500 |
50% | 139.500000 | 1009.025000 |
75% | 213.750000 | 1500.265000 |
max | 289.000000 | 1992.640000 |
0 | 1 | 2 | |
---|---|---|---|
count | 1396 | 1396 | 1396 |
unique | 213 | 23 | 60 |
top | 2015-12-10 | http://www.movie.com/bor/ | 借我;谢春花;90;伤感 |
freq | 16 | 100 | 32 |
重复值处理
在处理数据中,可能会出现重复的数据,我们通常需要将重复的记录删除。
发现重复值
我们可以通过duplicated方法来发现重复值。该方法返回Series类型的对象,值为布尔类型,表示是否与上一行重复。
参数说明:
- subset:指定依据哪些列判断是否重复,默认为所有列。
- keep:指定记录被标记为重复(True)的规则。默认为first。
删除重复值
通过drop_duplicates可以删除重复值。
参数说明:
- subset:指定依据哪些列判断是否重复,默认为所有列。
- keep:指定记录删除(或保留)的规则。默认为First。
- inplace:指定是否就地修改,默认为False。
# 表示是否与之前每一行数据重复
df1 = pd.DataFrame([[1,2],[1,3],[1,2],[2,3],[1,3]])
display(df1)
print(df1.duplicated())
# keep默认first:第一个出现的标记flase,其余为true
# last:最后一个出现的标记false,其余为true
# false:全部标记为true
print(df1.duplicated(keep="last"))
0 | 1 | |
---|---|---|
0 | 1 | 2 |
1 | 1 | 3 |
2 | 1 | 2 |
3 | 2 | 3 |
4 | 1 | 3 |
0 False
1 False
2 True
3 False
4 True
dtype: bool
0 True
1 True
2 False
3 False
4 False
dtype: bool
# 删除重复值---删除duplicated标记为True的
df1.drop_duplicates()
# 数据探索,获取所有重复的记录。
df[df.duplicated(keep=False)]
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
61 | 2015-12-10 | http://www.movie.com/bor/12386/ | 《坏蛋必须死》;2015.11.27;2015.12.20;北京新力量、华谊兄弟、南京大道行... | NaN | NaN |
221 | 2015-12-19 | http://www.movie.com/bor/ | 《一念天堂》;2015.12.31;2016.2.13;天河盛宴,凯德盛世(北京)投资管理有... | NaN | NaN |
254 | 2015-12-10 | http://www.movie.com/bor/12386/ | 《探灵档案》;2015.3.7;2015.3.22;壹马时代文化传媒(北京)有限公司、北京盛... | NaN | NaN |
330 | 2015-12-2 | http://www.movie.com/dor/ | 《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三... | NaN | NaN |
352 | 2015-12-17 | http://www.movie.com/bor/12386/ | 《百团大战》;2015.8.28;2015.10.11;八一电影制片厂;中国电影股份有限公司... | NaN | NaN |
404 | 2015-12-23 | http://www.movie.com/bor/ | 《万物生长》;2015.4.17;2015.5.24;北京劳雷影业、杭州果麦文化传媒、北京联... | NaN | NaN |
431 | 2015-12-13 | http://www.movie.com/dor/ | 《探灵档案》;2015.3.7;2015.3.22;壹马时代文化传媒(北京)有限公司、北京盛... | NaN | NaN |
438 | 2015-12-7 | http://www.movie.com/bor/12386/ | 《爱之初体验》;2015.8.7;2015.8.23;上海锦瑟天下影视有限公司;海涛;张超,... | NaN | NaN |
488 | 2015-12-6 | http://www.movie.com/bor/ | 《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影... | NaN | NaN |
498 | 2015-12-6 | http://www.movie.com/bor/12386/ | 《一念天堂》;2015.12.31;2016.2.13;天河盛宴,凯德盛世(北京)投资管理有... | NaN | NaN |
509 | 2015-12-7 | http://www.movie.com/bor/12386/ | 《爱之初体验》;2015.8.7;2015.8.23;上海锦瑟天下影视有限公司;海涛;张超,... | NaN | NaN |
594 | 2015-12-14 | http://www.movie.com/bor/ | 《简单爱》;2015.7.3;2015.7.19;中视合利(北京)文化投资有限公司一鸣影业公... | NaN | NaN |
629 | 2015-12-4 | http://www.movie.com/dor/ | 《破风》;2015.8.7;2015.9.13;恒大影视文化有限公司;林超贤;彭于晏,窦骁,... | NaN | NaN |
658 | 2015-12-6 | http://www.movie.com/bor/ | 《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影... | NaN | NaN |
733 | 2015-12-6 | http://www.movie.com/bor/12386/ | 《一念天堂》;2015.12.31;2016.2.13;天河盛宴,凯德盛世(北京)投资管理有... | NaN | NaN |
751 | 2015-12-25 | http://www.movie.com/bor/12386/ | 《怦然星动》;2015.12.3;2016.1.10;欢瑞世纪,嘉行传媒,青春光线;陈国辉;... | NaN | NaN |
760 | 2015-12-17 | http://www.movie.com/bor/12386/ | 《百团大战》;2015.8.28;2015.10.11;八一电影制片厂;中国电影股份有限公司... | NaN | NaN |
812 | 2015-12-10 | http://www.movie.com/bor/12386/ | 《坏蛋必须死》;2015.11.27;2015.12.20;北京新力量、华谊兄弟、南京大道行... | NaN | NaN |
914 | 2015-12-23 | http://www.movie.com/bor/ | 《万物生长》;2015.4.17;2015.5.24;北京劳雷影业、杭州果麦文化传媒、北京联... | NaN | NaN |
947 | 2015-12-25 | http://www.movie.com/bor/12386/ | 《怦然星动》;2015.12.3;2016.1.10;欢瑞世纪,嘉行传媒,青春光线;陈国辉;... | NaN | NaN |
986 | 2015-12-14 | http://www.movie.com/bor/ | 《简单爱》;2015.7.3;2015.7.19;中视合利(北京)文化投资有限公司一鸣影业公... | NaN | NaN |
1087 | 2015-12-13 | http://www.movie.com/dor/ | 《探灵档案》;2015.3.7;2015.3.22;壹马时代文化传媒(北京)有限公司、北京盛... | NaN | NaN |
1094 | 2015-12-10 | http://www.movie.com/bor/12386/ | 《探灵档案》;2015.3.7;2015.3.22;壹马时代文化传媒(北京)有限公司、北京盛... | NaN | NaN |
1224 | 2015-12-19 | http://www.movie.com/bor/ | 《一念天堂》;2015.12.31;2016.2.13;天河盛宴,凯德盛世(北京)投资管理有... | NaN | NaN |
1261 | 2015-12-2 | http://www.movie.com/dor/ | 《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三... | NaN | NaN |
1286 | 2015-12-4 | http://www.movie.com/dor/ | 《破风》;2015.8.7;2015.9.13;恒大影视文化有限公司;林超贤;彭于晏,窦骁,... | NaN | NaN |
数据过滤
可以使用布尔数组或者索引数组的方式来过滤数据。
另外,也可以用DataFrame类的query方法来进行数据过滤。在query方法中也可以使用外面定义的变量,需要在变量前加上@。
# 保留第三列大于100且第四列大于500的数据
# df[(df[3]>100)/ & (df[4]>500)]
# query方式
df.columns = ['date','url','info','value1','value2']
df.query("value1 > 100 and value2 >500")
# 使用外部变量加@符号
def get_record(min_,max_):
return df.query("value1>@min_ and value2>@max_")
get_record(200,700)
date | url | info | value1 | value2 | |
---|---|---|---|---|---|
0 | 2015-4-28 | http://www.apinpai.com/ | 采蘑菇的小姑娘;小蓓蕾组合;90;儿歌 | 216.0 | 1392.68 |
1 | 2015-8-24 | http://www.apinpai.com/ | 我;张国荣;80;励志 | 273.0 | 1447.17 |
5 | 2015-5-28 | http://www.favolist.com/ | 屋顶;温岚;80;励志 | 217.0 | 903.29 |
9 | 2015-8-7 | http://www.alifenfen.com/ | 星;邓丽君;80;励志 | 257.0 | 1779.36 |
10 | 2015-7-15 | http://www.waaku.com/ | 我心是海洋;蔡琴;80;励志 | 210.0 | 1240.49 |
... | ... | ... | ... | ... | ... |
1348 | 2015-4-14 | http://www.alifenfen.com/ | 太阳星辰;张学友;80;励志 | 211.0 | 887.35 |
1362 | 2015-6-22 | http://www.qudee.com/ | 逃脱;李玟;90;伤感 | 228.0 | 1099.51 |
1366 | 2015-5-31 | http://beijing.faxinxi.cn/ | 同道中人;张国荣;80;励志 | 225.0 | 1992.60 |
1375 | 2015-5-15 | http://www.favolist.com/ | 匿名的好友;杨丞琳;90;伤感 | 234.0 | 1044.16 |
1381 | 2015-6-20 | http://beijing.faxinxi.cn/ | 借我;谢春花;90;伤感 | 234.0 | 1133.67 |
212 rows × 5 columns
数据转换
应用与映射
Series与DataFrame对象可以进行行(列)或元素级别的映射转换操作。对于Series,可以调用apply或map方法。对于DataFrame,可以调用apply或applymap方法。
- apply:通过函数实现映射转换。【Series传递元素,DataFrame传递行或列。】
- map:对当前Series的值进行映射转换。参数可以是一个Series,一个字典或者是一个函数。
- applymap:通过函数实现元素级的映射转换。
替换
Series或DataFrame可以通过replace方法可以实现元素值的替换操作。
- to_replace:被替换值,支持单一值,列表,字典,正则表达式。
- regex:是否使用正则表达式,默认为False。
# apply数据转换(强调数据处理)
def fun1(item):
return item * 2 + 10
def fun2(item):
return item.upper()
s1 = pd.Series([100,200,300])
s2 = pd.Series(["abc","def","zjy"])
# 参数为一个函数
print(s1.apply(fun1))
# 非数值类型转换
print(s2.apply(fun2))
# 匿名函数实现
print(s2.apply(lambda x:x.upper()))
0 210
1 410
2 610
dtype: int64
0 ABC
1 DEF
2 ZJY
dtype: object
0 ABC
1 DEF
2 ZJY
dtype: object
# map数据转换(强调数据映射)
print(s1.map(lambda x:x/10))
print(s2.map({"abc":123,"def":456,"zjy":789})) # abc->123(abc映射成123)
m = pd.Series(['ABC','DEF','ZJY'],index=["abc","def","zjy"])
print(s2.map(m))
0 10.0
1 20.0
2 30.0
dtype: float64
0 123
1 456
2 789
dtype: int64
0 ABC
1 DEF
2 ZJY
dtype: object
# DataFrame的apply方法。针对DataFrame中的每一列(行)进行一个统一的操作。
# 对于Series而言,传递的是Series中的每个元素。
# 对于DataFrame而言,传递的是一行或一列(取决与axis的值是0还是1)
def fun1(item):
item["new_col"] = np.random.random()
return item
def fun2(item):
return item.head(10)
# 增加一列
display(df.head(10).apply(fun1,axis=1))
# 取前十行数据
display(df.apply(fun2,axis=0))
date | url | info | value1 | value2 | new_col | |
---|---|---|---|---|---|---|
0 | 2015-4-28 | http://www.apinpai.com/ | 采蘑菇的小姑娘;小蓓蕾组合;90;儿歌 | 216.0 | 1392.68 | 0.792708 |
1 | 2015-8-24 | http://www.apinpai.com/ | 我;张国荣;80;励志 | 273.0 | 1447.17 | 0.643926 |
2 | 2015-12-14 | http://www.movie.com/dor/ | 《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影... | NaN | NaN | 0.453618 |
3 | 2015-4-2 | http://bj.qu114.com/ | my way;张敬轩;90;励志 | 52.0 | 337.27 | 0.480762 |
4 | 2015-12-19 | http://www.movie.com/dor/ | 《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三... | NaN | NaN | 0.675917 |
5 | 2015-5-28 | http://www.favolist.com/ | 屋顶;温岚;80;励志 | 217.0 | 903.29 | 0.370894 |
6 | 2015-8-1 | http://www.apinpai.com/ | 小兔子乖乖;小蓓蕾组合;90;儿歌 | 184.0 | 473.07 | 0.702705 |
7 | 2015-8-6 | http://www.99inf.com/ | 光辉岁月;beyond;80;励志 | 72.0 | 1051.73 | 0.195878 |
8 | 2015-6-28 | http://www.qudee.com/ | 逃脱;李玟;90;伤感 | 123.0 | 483.23 | 0.285125 |
9 | 2015-8-7 | http://www.alifenfen.com/ | 星;邓丽君;80;励志 | 257.0 | 1779.36 | 0.897122 |
date | url | info | value1 | value2 | |
---|---|---|---|---|---|
0 | 2015-4-28 | http://www.apinpai.com/ | 采蘑菇的小姑娘;小蓓蕾组合;90;儿歌 | 216.0 | 1392.68 |
1 | 2015-8-24 | http://www.apinpai.com/ | 我;张国荣;80;励志 | 273.0 | 1447.17 |
2 | 2015-12-14 | http://www.movie.com/dor/ | 《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影... | NaN | NaN |
3 | 2015-4-2 | http://bj.qu114.com/ | my way;张敬轩;90;励志 | 52.0 | 337.27 |
4 | 2015-12-19 | http://www.movie.com/dor/ | 《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三... | NaN | NaN |
5 | 2015-5-28 | http://www.favolist.com/ | 屋顶;温岚;80;励志 | 217.0 | 903.29 |
6 | 2015-8-1 | http://www.apinpai.com/ | 小兔子乖乖;小蓓蕾组合;90;儿歌 | 184.0 | 473.07 |
7 | 2015-8-6 | http://www.99inf.com/ | 光辉岁月;beyond;80;励志 | 72.0 | 1051.73 |
8 | 2015-6-28 | http://www.qudee.com/ | 逃脱;李玟;90;伤感 | 123.0 | 483.23 |
9 | 2015-8-7 | http://www.alifenfen.com/ | 星;邓丽君;80;励志 | 257.0 | 1779.36 |
# DataFrame元素级的操作 applymap
df.sample(10).applymap(lambda x:str(x)+"---标记")
date | url | info | value1 | value2 | |
---|---|---|---|---|---|
828 | 2015-5-22---标记 | http://www.waaku.com/---标记 | 数鸭子;少儿歌曲;90;儿歌---标记 | 197.0---标记 | 1306.0---标记 |
795 | 2015-4-17---标记 | http://www.010y.com/---标记 | 同道中人;张国荣;80;励志---标记 | 78.0---标记 | 476.73---标记 |
284 | 2015-5-13---标记 | http://www.010y.com/---标记 | 无悔这一生;beyond;80;励志---标记 | 240.0---标记 | 1734.05---标记 |
1239 | 2015-7-31---标记 | http://www.qudee.com/---标记 | 加油;林俊杰/mc hotdog;90;励志---标记 | 111.0---标记 | 842.19---标记 |
1028 | 2015-3-29---标记 | http://www.wanxn.com/---标记 | 同道中人;张国荣;80;励志---标记 | 146.0---标记 | 917.4---标记 |
1335 | 2015-12-15---标记 | http://www.movie.com/bor/---标记 | 《紫霞》;2015.12.11;2015.12.27;映代码公司;苗述;徐洁儿,袁晓超,刘承... | nan---标记 | nan---标记 |
1076 | 2015-6-4---标记 | http://www.ezxun.com/---标记 | 忘记拥抱;a-lin;80;伤感---标记 | 233.0---标记 | 405.97---标记 |
1248 | 2015-6-24---标记 | http://www.yifawang.cn/---标记 | 同道中人;张国荣;80;励志---标记 | 227.0---标记 | 1838.88---标记 |
1073 | 2015-8-30---标记 | http://www.yifawang.cn/---标记 | 太阳星辰;张学友;80;励志---标记 | 173.0---标记 | 711.53---标记 |
163 | 2015-8-18---标记 | http://beijing.hand2hand.cn/---标记 | the climb;miley cyrus;80;励志---标记 | 19.0---标记 | 1491.87---标记 |
字符串矢量化计算
Series类型具有str属性(StringMethods类型),可以支持字符串的矢量化计算。StringMethods类中提供的方法基本与Python中str类型的方法名称相同,功能也对应相同。
说明:
- 字符串矢量化计算要求Series的数据是字符串类型。
# Series 类型的str属性(StringMethods类型),该类提供了很多方法,可以进行字符串的矢量化运算。
s = pd.Series(["abc","def","zjy"])
print(s.str.upper())
print(s.str.startswith("a"))
# print(s.str.extract("ab(\w+?)ab(\w+?)")
s = pd.Series(["abc,sdf", "dabe,abdsf", "gabh,abdsf"])
print(s.str.split(","))
# expand 可以将数据进行张开(变成一个DataFrame)
print(s.str.split(",",expand=True))
# Series的str属性只能是在Series的数据类型是字符串时,才能使用。
0 ABC
1 DEF
2 ZJY
dtype: object
0 True
1 False
2 False
dtype: bool
0 [abc, sdf]
1 [dabe, abdsf]
2 [gabh, abdsf]
dtype: object
0 1
0 abc sdf
1 dabe abdsf
2 gabh abdsf
# 替换replace进行元素级的替换操作。
display(df.head(10))
df.head(10).replace("2015-4-2","2020-02-02")
# 注意:替换是整个元素进行匹配的,而不是元素中包含我们指定的关键字,就进行替换。
# df.head(10).replace("2015", "2016")
# 对于要替换的关键字,可以指定多个。
df.replace(["2015-4-28", "2015-8-24"], "2015-1-1")
# 也可以将每个关键字替换成不同的值。
df.replace(["2015-4-28", "2015-8-24"], ["2016-4-28", "2017-8-24"])
# 也可以使用字典类型执行替换操作。字典的key指定要替换的关键字,字典的value指定替换之后的值。(即将key替换成value。)
df.replace({"2015-4-28":"2018-4-28", "2015-8-24":"2000-8-24"})
# 我们也可以指定正则表达式,进而进行更加灵活的替换。在使用正则表达式时,需要将regex参数设置为True。
df.replace("[0-9]{4}", "2000", regex=True)
date | url | info | value1 | value2 | |
---|---|---|---|---|---|
0 | 2015-4-28 | http://www.apinpai.com/ | 采蘑菇的小姑娘;小蓓蕾组合;90;儿歌 | 216.0 | 1392.68 |
1 | 2015-8-24 | http://www.apinpai.com/ | 我;张国荣;80;励志 | 273.0 | 1447.17 |
2 | 2015-12-14 | http://www.movie.com/dor/ | 《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影... | NaN | NaN |
3 | 2015-4-2 | http://bj.qu114.com/ | my way;张敬轩;90;励志 | 52.0 | 337.27 |
4 | 2015-12-19 | http://www.movie.com/dor/ | 《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三... | NaN | NaN |
5 | 2015-5-28 | http://www.favolist.com/ | 屋顶;温岚;80;励志 | 217.0 | 903.29 |
6 | 2015-8-1 | http://www.apinpai.com/ | 小兔子乖乖;小蓓蕾组合;90;儿歌 | 184.0 | 473.07 |
7 | 2015-8-6 | http://www.99inf.com/ | 光辉岁月;beyond;80;励志 | 72.0 | 1051.73 |
8 | 2015-6-28 | http://www.qudee.com/ | 逃脱;李玟;90;伤感 | 123.0 | 483.23 |
9 | 2015-8-7 | http://www.alifenfen.com/ | 星;邓丽君;80;励志 | 257.0 | 1779.36 |
date | url | info | value1 | value2 | |
---|---|---|---|---|---|
0 | 2000-4-28 | http://www.apinpai.com/ | 采蘑菇的小姑娘;小蓓蕾组合;90;儿歌 | 216.0 | 1392.68 |
1 | 2000-8-24 | http://www.apinpai.com/ | 我;张国荣;80;励志 | 273.0 | 1447.17 |
2 | 2000-12-14 | http://www.movie.com/dor/ | 《恶棍天使》;2000.12.24;2000.2.13;天津橙子映像传媒有限公司、北京光线影... | NaN | NaN |
3 | 2000-4-2 | http://bj.qu114.com/ | my way;张敬轩;90;励志 | 52.0 | 337.27 |
4 | 2000-12-19 | http://www.movie.com/dor/ | 《失孤》;2000.3.20;2000.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三... | NaN | NaN |
... | ... | ... | ... | ... | ... |
1391 | 2000-7-31 | http://beijing.faxinxi.cn/ | 同道中人;张国荣;80;励志 | 87.0 | 927.30 |
1392 | 2000-4-20 | http://www.denghuo.com/ | 忘记拥抱;a-lin;80;伤感 | 31.0 | 684.56 |
1393 | 2000-4-2 | http://www.yifawang.cn/ | 路...一直都在;陈奕迅;90;励志 | 47.0 | 1419.74 |
1394 | 2000-4-15 | http://www.wuhan58.com/index.php | 像我一样骄傲;赵传;80;励志 | 124.0 | 1434.67 |
1395 | 2000-5-16 | http://www.favolist.com/ | 最冷一天;陈奕迅;90;伤感 | 103.0 | 1020.50 |
1396 rows × 5 columns
数据合并
concat
我们可以通过DataFrame或Series类型的concat方法,来进行连接操作,连接时,会根据索引进行对齐。
- axis:指定连接轴,默认为0。
- join:指定连接方式,默认为外连接。【outer:并集,inner:交集】
- keys:可以用来区分不同的数据组。
- join_axes:指定连接结果集中保留的索引。
- ignore_index:忽略原来连接的索引,创建新的整数序列索引,默认为False。
append
在对行进行连接时,也可以使用Series或DataFrame的append方法。
df1 = df.head(10)
df2 = df.tail(10)
# 进行数据合并。axis指定合并的方向。0,竖直合并。1水平合并。
# DataFrame与ndarray数组合并的不同:对于ndarray,是对位进行合并,而对于DataFrame,是根据索引进行合并。
# pd.concat((df1, df2), axis=1)
# 在合并时,可以指定连接方式。(默认为外连接)
pd.concat((df1, df2), axis=1, join="inner")
# 可以指定keys,生成层级索引,能够观测数据的来源。
pd.concat((df1, df2), axis=0, keys=["data1", "data2"])
df1.columns = [5, 1, 2, 3, 4]
# 可以通过join_axes指定保留的索引。
# pd.concat((df1, df2), axis=0, join_axes=[df2.columns])
# pd.concat((df1, df2), axis=0, join_axes=[df1.columns])
# 通过 ignore_index 设置为True,就可以忽略之前的索引,重新生成新的索引。这样就能够避免多个DataFrame进行
# 合并时,索引重复。
pd.concat((df1, df2),axis=0, ignore_index=True)
df1.append(df2, ignore_index=True)
1 | 2 | 3 | 4 | 5 | date | info | url | value1 | value2 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | http://www.apinpai.com/ | 采蘑菇的小姑娘;小蓓蕾组合;90;儿歌 | 216.0 | 1392.68 | 2015-4-28 | NaN | NaN | NaN | NaN | NaN |
1 | http://www.apinpai.com/ | 我;张国荣;80;励志 | 273.0 | 1447.17 | 2015-8-24 | NaN | NaN | NaN | NaN | NaN |
2 | http://www.movie.com/dor/ | 《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影... | NaN | NaN | 2015-12-14 | NaN | NaN | NaN | NaN | NaN |
3 | http://bj.qu114.com/ | my way;张敬轩;90;励志 | 52.0 | 337.27 | 2015-4-2 | NaN | NaN | NaN | NaN | NaN |
4 | http://www.movie.com/dor/ | 《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三... | NaN | NaN | 2015-12-19 | NaN | NaN | NaN | NaN | NaN |
5 | http://www.favolist.com/ | 屋顶;温岚;80;励志 | 217.0 | 903.29 | 2015-5-28 | NaN | NaN | NaN | NaN | NaN |
6 | http://www.apinpai.com/ | 小兔子乖乖;小蓓蕾组合;90;儿歌 | 184.0 | 473.07 | 2015-8-1 | NaN | NaN | NaN | NaN | NaN |
7 | http://www.99inf.com/ | 光辉岁月;beyond;80;励志 | 72.0 | 1051.73 | 2015-8-6 | NaN | NaN | NaN | NaN | NaN |
8 | http://www.qudee.com/ | 逃脱;李玟;90;伤感 | 123.0 | 483.23 | 2015-6-28 | NaN | NaN | NaN | NaN | NaN |
9 | http://www.alifenfen.com/ | 星;邓丽君;80;励志 | 257.0 | 1779.36 | 2015-8-7 | NaN | NaN | NaN | NaN | NaN |
10 | NaN | NaN | NaN | NaN | NaN | 2015-4-2 | 逃脱;李玟;90;伤感 | http://www.ezxun.com/ | 135.0 | 1315.94 |
11 | NaN | NaN | NaN | NaN | NaN | 2015-6-24 | 加油;林俊杰/mc hotdog;90;励志 | http://www.wuhan58.com/index.php | 117.0 | 1663.44 |
12 | NaN | NaN | NaN | NaN | NaN | 2015-8-12 | 最冷一天;陈奕迅;90;伤感 | http://info.tianya.cn | 167.0 | 291.41 |
13 | NaN | NaN | NaN | NaN | NaN | 2015-6-23 | 我心是海洋;蔡琴;80;励志 | http://www.wuhan58.com/index.php | 129.0 | 1006.90 |
14 | NaN | NaN | NaN | NaN | NaN | 2015-7-20 | 空壳;陈慧敏;90;伤感 | http://www.ezxun.com/ | 128.0 | 1481.91 |
15 | NaN | NaN | NaN | NaN | NaN | 2015-7-31 | 同道中人;张国荣;80;励志 | http://beijing.faxinxi.cn/ | 87.0 | 927.30 |
16 | NaN | NaN | NaN | NaN | NaN | 2015-4-20 | 忘记拥抱;a-lin;80;伤感 | http://www.denghuo.com/ | 31.0 | 684.56 |
17 | NaN | NaN | NaN | NaN | NaN | 2015-4-2 | 路...一直都在;陈奕迅;90;励志 | http://www.yifawang.cn/ | 47.0 | 1419.74 |
18 | NaN | NaN | NaN | NaN | NaN | 2015-4-15 | 像我一样骄傲;赵传;80;励志 | http://www.wuhan58.com/index.php | 124.0 | 1434.67 |
19 | NaN | NaN | NaN | NaN | NaN | 2015-5-16 | 最冷一天;陈奕迅;90;伤感 | http://www.favolist.com/ | 103.0 | 1020.50 |
merge
通过pandas或DataFrame的merge方法,可以进行两个DataFrame的连接,这种连接类似于SQL中对两张表进行的join连接。
- how:指定连接方式。可以是inner, outer, left, right,默认为inner。
- on 指定连接使用的列(该列必须同时出现在两个DataFrame中),默认使用两个DataFrame中的所有同名列进行连接。
- left_on / right_on:指定左右DataFrame中连接所使用的列。
- left_index / right_index:是否将左边(右边)DataFrame中的索引作为连接列,默认为False。
- suffixes:当两个DataFrame列名相同时,指定每个列名的后缀(用来区分),默认为_x与_y。
df1 = pd.DataFrame([[10, 2, 3], [4, 5, 6]])
df2 = pd.DataFrame([[1, 2, 3], [2, 3, 5]], columns=[4, 1, 2])
display(df1, df2)
# merge类似于数据库中的join连接。当没有指定任何连接条件,会根据所有同名的列(标签)进行等值连接。
# 这就类似与数据库中的自然连接。natrual join。
df1.merge(df2,how="outer")
# on参数, 显示指定使用哪些字段进行等值连接。默认使用所有同名字段进行等值连接。
# on指定的列必须同时出现在两张表中。
df1.merge(df2, on=[1, 2])
# left_on right_on指定左右表用于连接的列。(可以不使用同名字段进行等值连接。)
df1.merge(df2, left_on=1, right_on=2)
# left_index,right_index 指定是否使用索引进行等值连接,默认是False。
df1.merge(df2, left_index=True, right_index=True)
df1.merge(df2, left_index=True, right_on=4)
# suffies 指定当两张表列名相同时,使用的后缀。默认为_x,_y
# df1.merge(df2, on=1, suffixes=["_a", "_b"])
0 | 1 | 2 | |
---|---|---|---|
0 | 10 | 2 | 3 |
1 | 4 | 5 | 6 |
4 | 1 | 2 | |
---|---|---|---|
0 | 1 | 2 | 3 |
1 | 2 | 3 | 5 |
0 | 1_x | 2_x | 4 | 1_y | 2_y | |
---|---|---|---|---|---|---|
0 | 4 | 5 | 6 | 1 | 2 | 3 |
join
与merge方法类似,但是默认使用索引进行连接。
- how:指定连接方式。可以是inner, outer, left, right,默认为left。
- on:设置当前DataFrame对象使用哪个列与参数对象的索引进行连接。
- lsuffix / rsuffix:当两个DataFrame列名相同时,指定每个列名的后缀(用来区分),如果不指定,列名相同会产生错误。
# join与merge相似,都是类似于数据库中的join连接,但是,二者还是有区别的:u
# 1 merge方法在列名相同的时候,存在默认的后缀(_x,_y),而join方法没有默认的后缀,需要我们显式指定。
# 2 merge方法默认使用所有同名字段进行等值连接,而join默认使用索引进行等值连接。
# 3 merge默认使用inner(内连接),join默认使用left(左外连接)
# 4 merge方法on参数,指定两张表的同名字段进行等值连接。而join方法on参数,指定左表中使用哪个字段与右表的
# 索引进行等值连接。(merge方法on参数影响两张表,而join方法on参数仅影响左表。)
display(df1, df2)
df1.join(df2, lsuffix="_A", rsuffix="_B")
df1.join(df2, lsuffix="_A", rsuffix="_B", on=1)
0 | 1 | 2 | |
---|---|---|---|
0 | 10 | 2 | 3 |
1 | 4 | 5 | 6 |
4 | 1 | 2 | |
---|---|---|---|
0 | 1 | 2 | 3 |
1 | 2 | 3 | 5 |
0 | 1_A | 2_A | 4 | 1_B | 2_B | |
---|---|---|---|---|---|---|
0 | 10 | 2 | 3 | NaN | NaN | NaN |
1 | 4 | 5 | 6 | NaN | NaN | NaN |