数据处理

数据处理

数据加载

首先,我们需要将收集的数据加载到内存中,才能进行进一步的操作。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))

dateurlinfo
02015-4-28http://www.apinpai.com/采蘑菇的小姑娘;小蓓蕾组合;90;儿歌
12015-8-24http://www.apinpai.com/我;张国荣;80;励志
22015-12-14http://www.movie.com/dor/《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影...
32015-4-2http://bj.qu114.com/my way;张敬轩;90;励志
42015-12-19http://www.movie.com/dor/《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三...
52015-5-28http://www.favolist.com/屋顶;温岚;80;励志
62015-8-1http://www.apinpai.com/小兔子乖乖;小蓓蕾组合;90;儿歌
72015-8-6http://www.99inf.com/光辉岁月;beyond;80;励志
82015-6-28http://www.qudee.com/逃脱;李玟;90;伤感
92015-8-7http://www.alifenfen.com/星;邓丽君;80;励志
dateurlinfo
13772015-5-10http://www.010y.com/感恩的心;欧阳菲菲;90;励志
5142015-3-12http://bj.qu114.com/给所有知道我名字的人;赵传;80;励志
2352015-5-13http://www.99inf.com/借我;谢春花;90;伤感
6052015-6-8http://www.wuhan58.com/index.php来来回回;陈楚生&spy.c;90;伤感
10472015-12-22http://www.movie.com/bor/《闯入者》;2015.4.30;2015.5.24;冬春文化、银润传媒、合润传媒、安乐电影、...
7352015-8-16http://bj.454.cn/来来回回;陈楚生&spy.c;90;伤感
1682015-8-10http://www.yifawang.cn/我心是海洋;蔡琴;80;励志
6852015-3-9http://www.yifawang.cn/采蘑菇的小姑娘;小蓓蕾组合;90;儿歌
11562015-7-23http://bj.qu114.com/我心是海洋;蔡琴;80;励志
1752015-12-7http://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_namecom_codetotal_scorebase_scoreachievementpunish_01punish_02rewardinfo_01info_02
id
3344上海浦东施湾建筑安装工程有限公司13355356-567.435.00.420.05.00.05.02.0
19484上海浩畅建设工程有限公司69294402-868.035.00.020.05.00.05.03.0
18028上海景行市政工程有限公司58062646-367.235.00.220.05.00.05.02.0
18519浙江振华建设有限公司69360526-367.035.00.020.05.00.05.02.0
8211盐城市兴达建筑工程有限公司14034250-467.035.00.020.05.00.05.02.0
6262弘衍信息科技(上海)有限公司06257617-967.035.00.020.05.00.05.02.0
7892上海如虎建筑工程有限公司MA1K21J3-667.035.00.020.05.00.05.02.0
20650广东松本绿色新材股份有限公司69478043-467.035.00.020.05.00.05.02.0
1697歌山建设集团有限公司70458321-669.035.00.020.05.02.05.02.0
18888盐城市嘉成机械设备安装有限公司68831080-768.035.00.020.05.00.05.03.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])
012
0123.0
145NaN
# 可以写到数据流当中
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
01234
02015-4-28http://www.apinpai.com/采蘑菇的小姑娘;小蓓蕾组合;90;儿歌216.01392.68
12015-8-24http://www.apinpai.com/我;张国荣;80;励志273.01447.17
32015-4-2http://bj.qu114.com/my way;张敬轩;90;励志52.0337.27
52015-5-28http://www.favolist.com/屋顶;温岚;80;励志217.0903.29
62015-8-1http://www.apinpai.com/小兔子乖乖;小蓓蕾组合;90;儿歌184.0473.07
..................
13912015-7-31http://beijing.faxinxi.cn/同道中人;张国荣;80;励志87.0927.30
13922015-4-20http://www.denghuo.com/忘记拥抱;a-lin;80;伤感31.0684.56
13932015-4-2http://www.yifawang.cn/路...一直都在;陈奕迅;90;励志47.01419.74
13942015-4-15http://www.wuhan58.com/index.php像我一样骄傲;赵传;80;励志124.01434.67
13952015-5-16http://www.favolist.com/最冷一天;陈奕迅;90;伤感103.01020.50

1098 rows × 5 columns

# inplace 指定是否就地修改。默认值为False
# df.dropna(inplace=True)
# display(df)
# subset 指定需要考虑的标签
df.dropna(axis=0, subset=[2,3,4],how="all")
01234
02015-4-28http://www.apinpai.com/采蘑菇的小姑娘;小蓓蕾组合;90;儿歌216.01392.68
12015-8-24http://www.apinpai.com/我;张国荣;80;励志273.01447.17
22015-12-14http://www.movie.com/dor/《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影...NaNNaN
32015-4-2http://bj.qu114.com/my way;张敬轩;90;励志52.0337.27
42015-12-19http://www.movie.com/dor/《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三...NaNNaN
..................
13912015-7-31http://beijing.faxinxi.cn/同道中人;张国荣;80;励志87.0927.30
13922015-4-20http://www.denghuo.com/忘记拥抱;a-lin;80;伤感31.0684.56
13932015-4-2http://www.yifawang.cn/路...一直都在;陈奕迅;90;励志47.01419.74
13942015-4-15http://www.wuhan58.com/index.php像我一样骄傲;赵传;80;励志124.01434.67
13952015-5-16http://www.favolist.com/最冷一天;陈奕迅;90;伤感103.01020.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()})   # 用对应列平均值填充
01234
02015-4-28http://www.apinpai.com/采蘑菇的小姑娘;小蓓蕾组合;90;儿歌216.01392.68
12015-8-24http://www.apinpai.com/我;张国荣;80;励志273.01447.17
22015-12-14http://www.movie.com/dor/《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影...NaNNaN
32015-4-2http://bj.qu114.com/my way;张敬轩;90;励志52.0337.27
42015-12-19http://www.movie.com/dor/《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三...NaNNaN
..................
13912015-7-31http://beijing.faxinxi.cn/同道中人;张国荣;80;励志87.0927.30
13922015-4-20http://www.denghuo.com/忘记拥抱;a-lin;80;伤感31.0684.56
13932015-4-2http://www.yifawang.cn/路...一直都在;陈奕迅;90;励志47.01419.74
13942015-4-15http://www.wuhan58.com/index.php像我一样骄傲;赵传;80;励志124.01434.67
13952015-5-16http://www.favolist.com/最冷一天;陈奕迅;90;伤感103.01020.50

1396 rows × 5 columns

01234
02015-4-28http://www.apinpai.com/采蘑菇的小姑娘;小蓓蕾组合;90;儿歌216.0000001392.680000
12015-8-24http://www.apinpai.com/我;张国荣;80;励志273.0000001447.170000
22015-12-14http://www.movie.com/dor/《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影...143.0828781017.034235
32015-4-2http://bj.qu114.com/my way;张敬轩;90;励志52.000000337.270000
42015-12-19http://www.movie.com/dor/《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三...143.0828781017.034235
..................
13912015-7-31http://beijing.faxinxi.cn/同道中人;张国荣;80;励志87.000000927.300000
13922015-4-20http://www.denghuo.com/忘记拥抱;a-lin;80;伤感31.000000684.560000
13932015-4-2http://www.yifawang.cn/路...一直都在;陈奕迅;90;励志47.0000001419.740000
13942015-4-15http://www.wuhan58.com/index.php像我一样骄傲;赵传;80;励志124.0000001434.670000
13952015-5-16http://www.favolist.com/最冷一天;陈奕迅;90;伤感103.0000001020.500000

1396 rows × 5 columns

# method:邻近值填充(趋势数据)(ffill/bfill:前值/后值)
df.fillna(method="ffill")
01234
02015-4-28http://www.apinpai.com/采蘑菇的小姑娘;小蓓蕾组合;90;儿歌216.01392.68
12015-8-24http://www.apinpai.com/我;张国荣;80;励志273.01447.17
22015-12-14http://www.movie.com/dor/《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影...273.01447.17
32015-4-2http://bj.qu114.com/my way;张敬轩;90;励志52.0337.27
42015-12-19http://www.movie.com/dor/《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三...52.0337.27
..................
13912015-7-31http://beijing.faxinxi.cn/同道中人;张国荣;80;励志87.0927.30
13922015-4-20http://www.denghuo.com/忘记拥抱;a-lin;80;伤感31.0684.56
13932015-4-2http://www.yifawang.cn/路...一直都在;陈奕迅;90;励志47.01419.74
13942015-4-15http://www.wuhan58.com/index.php像我一样骄傲;赵传;80;励志124.01434.67
13952015-5-16http://www.favolist.com/最冷一天;陈奕迅;90;伤感103.01020.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)
34
count1098.0000001098.000000
mean143.0828781017.034235
std80.803922550.759464
min6.00000051.390000
25%73.250000555.042500
50%139.5000001009.025000
75%213.7500001500.265000
max289.0000001992.640000
012
count139613961396
unique2132360
top2015-12-10http://www.movie.com/bor/借我;谢春花;90;伤感
freq1610032

重复值处理

在处理数据中,可能会出现重复的数据,我们通常需要将重复的记录删除。

发现重复值

我们可以通过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"))
01
012
113
212
323
413
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)]
01234
612015-12-10http://www.movie.com/bor/12386/《坏蛋必须死》;2015.11.27;2015.12.20;北京新力量、华谊兄弟、南京大道行...NaNNaN
2212015-12-19http://www.movie.com/bor/《一念天堂》;2015.12.31;2016.2.13;天河盛宴,凯德盛世(北京)投资管理有...NaNNaN
2542015-12-10http://www.movie.com/bor/12386/《探灵档案》;2015.3.7;2015.3.22;壹马时代文化传媒(北京)有限公司、北京盛...NaNNaN
3302015-12-2http://www.movie.com/dor/《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三...NaNNaN
3522015-12-17http://www.movie.com/bor/12386/《百团大战》;2015.8.28;2015.10.11;八一电影制片厂;中国电影股份有限公司...NaNNaN
4042015-12-23http://www.movie.com/bor/《万物生长》;2015.4.17;2015.5.24;北京劳雷影业、杭州果麦文化传媒、北京联...NaNNaN
4312015-12-13http://www.movie.com/dor/《探灵档案》;2015.3.7;2015.3.22;壹马时代文化传媒(北京)有限公司、北京盛...NaNNaN
4382015-12-7http://www.movie.com/bor/12386/《爱之初体验》;2015.8.7;2015.8.23;上海锦瑟天下影视有限公司;海涛;张超,...NaNNaN
4882015-12-6http://www.movie.com/bor/《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影...NaNNaN
4982015-12-6http://www.movie.com/bor/12386/《一念天堂》;2015.12.31;2016.2.13;天河盛宴,凯德盛世(北京)投资管理有...NaNNaN
5092015-12-7http://www.movie.com/bor/12386/《爱之初体验》;2015.8.7;2015.8.23;上海锦瑟天下影视有限公司;海涛;张超,...NaNNaN
5942015-12-14http://www.movie.com/bor/《简单爱》;2015.7.3;2015.7.19;中视合利(北京)文化投资有限公司一鸣影业公...NaNNaN
6292015-12-4http://www.movie.com/dor/《破风》;2015.8.7;2015.9.13;恒大影视文化有限公司;林超贤;彭于晏,窦骁,...NaNNaN
6582015-12-6http://www.movie.com/bor/《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影...NaNNaN
7332015-12-6http://www.movie.com/bor/12386/《一念天堂》;2015.12.31;2016.2.13;天河盛宴,凯德盛世(北京)投资管理有...NaNNaN
7512015-12-25http://www.movie.com/bor/12386/《怦然星动》;2015.12.3;2016.1.10;欢瑞世纪,嘉行传媒,青春光线;陈国辉;...NaNNaN
7602015-12-17http://www.movie.com/bor/12386/《百团大战》;2015.8.28;2015.10.11;八一电影制片厂;中国电影股份有限公司...NaNNaN
8122015-12-10http://www.movie.com/bor/12386/《坏蛋必须死》;2015.11.27;2015.12.20;北京新力量、华谊兄弟、南京大道行...NaNNaN
9142015-12-23http://www.movie.com/bor/《万物生长》;2015.4.17;2015.5.24;北京劳雷影业、杭州果麦文化传媒、北京联...NaNNaN
9472015-12-25http://www.movie.com/bor/12386/《怦然星动》;2015.12.3;2016.1.10;欢瑞世纪,嘉行传媒,青春光线;陈国辉;...NaNNaN
9862015-12-14http://www.movie.com/bor/《简单爱》;2015.7.3;2015.7.19;中视合利(北京)文化投资有限公司一鸣影业公...NaNNaN
10872015-12-13http://www.movie.com/dor/《探灵档案》;2015.3.7;2015.3.22;壹马时代文化传媒(北京)有限公司、北京盛...NaNNaN
10942015-12-10http://www.movie.com/bor/12386/《探灵档案》;2015.3.7;2015.3.22;壹马时代文化传媒(北京)有限公司、北京盛...NaNNaN
12242015-12-19http://www.movie.com/bor/《一念天堂》;2015.12.31;2016.2.13;天河盛宴,凯德盛世(北京)投资管理有...NaNNaN
12612015-12-2http://www.movie.com/dor/《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三...NaNNaN
12862015-12-4http://www.movie.com/dor/《破风》;2015.8.7;2015.9.13;恒大影视文化有限公司;林超贤;彭于晏,窦骁,...NaNNaN

数据过滤

可以使用布尔数组或者索引数组的方式来过滤数据。
另外,也可以用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)
dateurlinfovalue1value2
02015-4-28http://www.apinpai.com/采蘑菇的小姑娘;小蓓蕾组合;90;儿歌216.01392.68
12015-8-24http://www.apinpai.com/我;张国荣;80;励志273.01447.17
52015-5-28http://www.favolist.com/屋顶;温岚;80;励志217.0903.29
92015-8-7http://www.alifenfen.com/星;邓丽君;80;励志257.01779.36
102015-7-15http://www.waaku.com/我心是海洋;蔡琴;80;励志210.01240.49
..................
13482015-4-14http://www.alifenfen.com/太阳星辰;张学友;80;励志211.0887.35
13622015-6-22http://www.qudee.com/逃脱;李玟;90;伤感228.01099.51
13662015-5-31http://beijing.faxinxi.cn/同道中人;张国荣;80;励志225.01992.60
13752015-5-15http://www.favolist.com/匿名的好友;杨丞琳;90;伤感234.01044.16
13812015-6-20http://beijing.faxinxi.cn/借我;谢春花;90;伤感234.01133.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))
dateurlinfovalue1value2new_col
02015-4-28http://www.apinpai.com/采蘑菇的小姑娘;小蓓蕾组合;90;儿歌216.01392.680.792708
12015-8-24http://www.apinpai.com/我;张国荣;80;励志273.01447.170.643926
22015-12-14http://www.movie.com/dor/《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影...NaNNaN0.453618
32015-4-2http://bj.qu114.com/my way;张敬轩;90;励志52.0337.270.480762
42015-12-19http://www.movie.com/dor/《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三...NaNNaN0.675917
52015-5-28http://www.favolist.com/屋顶;温岚;80;励志217.0903.290.370894
62015-8-1http://www.apinpai.com/小兔子乖乖;小蓓蕾组合;90;儿歌184.0473.070.702705
72015-8-6http://www.99inf.com/光辉岁月;beyond;80;励志72.01051.730.195878
82015-6-28http://www.qudee.com/逃脱;李玟;90;伤感123.0483.230.285125
92015-8-7http://www.alifenfen.com/星;邓丽君;80;励志257.01779.360.897122
dateurlinfovalue1value2
02015-4-28http://www.apinpai.com/采蘑菇的小姑娘;小蓓蕾组合;90;儿歌216.01392.68
12015-8-24http://www.apinpai.com/我;张国荣;80;励志273.01447.17
22015-12-14http://www.movie.com/dor/《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影...NaNNaN
32015-4-2http://bj.qu114.com/my way;张敬轩;90;励志52.0337.27
42015-12-19http://www.movie.com/dor/《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三...NaNNaN
52015-5-28http://www.favolist.com/屋顶;温岚;80;励志217.0903.29
62015-8-1http://www.apinpai.com/小兔子乖乖;小蓓蕾组合;90;儿歌184.0473.07
72015-8-6http://www.99inf.com/光辉岁月;beyond;80;励志72.01051.73
82015-6-28http://www.qudee.com/逃脱;李玟;90;伤感123.0483.23
92015-8-7http://www.alifenfen.com/星;邓丽君;80;励志257.01779.36
# DataFrame元素级的操作 applymap
df.sample(10).applymap(lambda x:str(x)+"---标记")
dateurlinfovalue1value2
8282015-5-22---标记http://www.waaku.com/---标记数鸭子;少儿歌曲;90;儿歌---标记197.0---标记1306.0---标记
7952015-4-17---标记http://www.010y.com/---标记同道中人;张国荣;80;励志---标记78.0---标记476.73---标记
2842015-5-13---标记http://www.010y.com/---标记无悔这一生;beyond;80;励志---标记240.0---标记1734.05---标记
12392015-7-31---标记http://www.qudee.com/---标记加油;林俊杰/mc hotdog;90;励志---标记111.0---标记842.19---标记
10282015-3-29---标记http://www.wanxn.com/---标记同道中人;张国荣;80;励志---标记146.0---标记917.4---标记
13352015-12-15---标记http://www.movie.com/bor/---标记《紫霞》;2015.12.11;2015.12.27;映代码公司;苗述;徐洁儿,袁晓超,刘承...nan---标记nan---标记
10762015-6-4---标记http://www.ezxun.com/---标记忘记拥抱;a-lin;80;伤感---标记233.0---标记405.97---标记
12482015-6-24---标记http://www.yifawang.cn/---标记同道中人;张国荣;80;励志---标记227.0---标记1838.88---标记
10732015-8-30---标记http://www.yifawang.cn/---标记太阳星辰;张学友;80;励志---标记173.0---标记711.53---标记
1632015-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)
dateurlinfovalue1value2
02015-4-28http://www.apinpai.com/采蘑菇的小姑娘;小蓓蕾组合;90;儿歌216.01392.68
12015-8-24http://www.apinpai.com/我;张国荣;80;励志273.01447.17
22015-12-14http://www.movie.com/dor/《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影...NaNNaN
32015-4-2http://bj.qu114.com/my way;张敬轩;90;励志52.0337.27
42015-12-19http://www.movie.com/dor/《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三...NaNNaN
52015-5-28http://www.favolist.com/屋顶;温岚;80;励志217.0903.29
62015-8-1http://www.apinpai.com/小兔子乖乖;小蓓蕾组合;90;儿歌184.0473.07
72015-8-6http://www.99inf.com/光辉岁月;beyond;80;励志72.01051.73
82015-6-28http://www.qudee.com/逃脱;李玟;90;伤感123.0483.23
92015-8-7http://www.alifenfen.com/星;邓丽君;80;励志257.01779.36
dateurlinfovalue1value2
02000-4-28http://www.apinpai.com/采蘑菇的小姑娘;小蓓蕾组合;90;儿歌216.01392.68
12000-8-24http://www.apinpai.com/我;张国荣;80;励志273.01447.17
22000-12-14http://www.movie.com/dor/《恶棍天使》;2000.12.24;2000.2.13;天津橙子映像传媒有限公司、北京光线影...NaNNaN
32000-4-2http://bj.qu114.com/my way;张敬轩;90;励志52.0337.27
42000-12-19http://www.movie.com/dor/《失孤》;2000.3.20;2000.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三...NaNNaN
..................
13912000-7-31http://beijing.faxinxi.cn/同道中人;张国荣;80;励志87.0927.30
13922000-4-20http://www.denghuo.com/忘记拥抱;a-lin;80;伤感31.0684.56
13932000-4-2http://www.yifawang.cn/路...一直都在;陈奕迅;90;励志47.01419.74
13942000-4-15http://www.wuhan58.com/index.php像我一样骄傲;赵传;80;励志124.01434.67
13952000-5-16http://www.favolist.com/最冷一天;陈奕迅;90;伤感103.01020.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)
12345dateinfourlvalue1value2
0http://www.apinpai.com/采蘑菇的小姑娘;小蓓蕾组合;90;儿歌216.01392.682015-4-28NaNNaNNaNNaNNaN
1http://www.apinpai.com/我;张国荣;80;励志273.01447.172015-8-24NaNNaNNaNNaNNaN
2http://www.movie.com/dor/《恶棍天使》;2015.12.24;2016.2.13;天津橙子映像传媒有限公司、北京光线影...NaNNaN2015-12-14NaNNaNNaNNaNNaN
3http://bj.qu114.com/my way;张敬轩;90;励志52.0337.272015-4-2NaNNaNNaNNaNNaN
4http://www.movie.com/dor/《失孤》;2015.3.20;2015.5.3;华谊兄弟传媒集团、源合圣影视、映艺娱乐;彭三...NaNNaN2015-12-19NaNNaNNaNNaNNaN
5http://www.favolist.com/屋顶;温岚;80;励志217.0903.292015-5-28NaNNaNNaNNaNNaN
6http://www.apinpai.com/小兔子乖乖;小蓓蕾组合;90;儿歌184.0473.072015-8-1NaNNaNNaNNaNNaN
7http://www.99inf.com/光辉岁月;beyond;80;励志72.01051.732015-8-6NaNNaNNaNNaNNaN
8http://www.qudee.com/逃脱;李玟;90;伤感123.0483.232015-6-28NaNNaNNaNNaNNaN
9http://www.alifenfen.com/星;邓丽君;80;励志257.01779.362015-8-7NaNNaNNaNNaNNaN
10NaNNaNNaNNaNNaN2015-4-2逃脱;李玟;90;伤感http://www.ezxun.com/135.01315.94
11NaNNaNNaNNaNNaN2015-6-24加油;林俊杰/mc hotdog;90;励志http://www.wuhan58.com/index.php117.01663.44
12NaNNaNNaNNaNNaN2015-8-12最冷一天;陈奕迅;90;伤感http://info.tianya.cn167.0291.41
13NaNNaNNaNNaNNaN2015-6-23我心是海洋;蔡琴;80;励志http://www.wuhan58.com/index.php129.01006.90
14NaNNaNNaNNaNNaN2015-7-20空壳;陈慧敏;90;伤感http://www.ezxun.com/128.01481.91
15NaNNaNNaNNaNNaN2015-7-31同道中人;张国荣;80;励志http://beijing.faxinxi.cn/87.0927.30
16NaNNaNNaNNaNNaN2015-4-20忘记拥抱;a-lin;80;伤感http://www.denghuo.com/31.0684.56
17NaNNaNNaNNaNNaN2015-4-2路...一直都在;陈奕迅;90;励志http://www.yifawang.cn/47.01419.74
18NaNNaNNaNNaNNaN2015-4-15像我一样骄傲;赵传;80;励志http://www.wuhan58.com/index.php124.01434.67
19NaNNaNNaNNaNNaN2015-5-16最冷一天;陈奕迅;90;伤感http://www.favolist.com/103.01020.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"])
012
01023
1456
412
0123
1235
01_x2_x41_y2_y
0456123

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)
012
01023
1456
412
0123
1235
01_A2_A41_B2_B
01023NaNNaNNaN
1456NaNNaNNaN
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值