pandas 简单使用 - CongGreat/async-await GitHub Wiki

pandas 的数据结构

pandas包含两种最主要数据结构:序列(Series)和数据框(DataFrame)。 对于这两个数据结构,有两个最基本的概念:轴(Axis)和标签(Label),对于二维数据结构,轴是指行和列,轴标签是指行的索引和列的名称,存储轴标签的数据结构是Index结构。
https://www.gairuo.com/p/pandas-data-structure

import pandas as pd

Series

ser1 = pd.Series([1, 2, 3, 4])
ser1
0    1
1    2
2    3
3    4
dtype: int64

DataFrame

数据框(DataFrame)存储的是二维数据,数据框的结构由row和column构成,每一行都有一个row label,每一列都有一个column label,把row和column称作axis,把row label和column label称作axis label。通常情况下,column label 是文本类型,是列名称(column name),而row label是数值类型,也称作行索引(row index)。

df1 = pd.DataFrame([{"name":"Annie", "age":7, "sex": "female"}, 
                    {"name":"Lee Sin", "age":36, "sex": "male"}, 
                    {"name":"Leona", "age":27, "sex": "female"}, 
                    {"name":"Timo", "age": 15, "sex": "male"}
                   ])
df1
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
name age sex
0 Annie 7 female
1 Lee Sin 36 male
2 Leona 27 female
3 Timo 15 male

pandas 的数据类型

字符串类型:object. 整数类型:Int64,Int32,Int16, Int8. 无符号整数:UInt64,UInt32,UInt16, UInt8. 浮点数类型:float64,float32. int64

查看Series的数据类型

ser1.dtypes
dtype('int64')

查看DataFrame的数据类型

df1.dtypes
name    object
age      int64
sex     object
dtype: object

查看DataFrame中某个字段的类型

df1.name.dtypes
dtype('O')

修改数据类型

df1 = df1.astype({'age': 'float'})
df1.age.dtypes
dtype('float64')

生成数据对象,以DataFame为例

python 数据生成DataFrame

py_list = [["Annie", 7, "female"],
           ["Lee Sin", 36, "male"],
           ["Leona", 27, "female"],
           ["Timo", 15, "male"]]
df_list = pd.DataFrame(py_list, columns=['name', 'age', 'sex'])
df_list
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
name age sex
0 Annie 7 female
1 Lee Sin 36 male
2 Leona 27 female
3 Timo 15 male
py_dict = {"name":["Annie", "Lee Sin", "Leona", "Timo"],
           "age":[7, 36, 27, 15],
           "sex":["female", "male", "female", "male"]}
df_dict = pd.DataFrame(py_dict)
df_dict
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
name age sex
0 Annie 7 female
1 Lee Sin 36 male
2 Leona 27 female
3 Timo 15 male
df_dict1 = pd.DataFrame.from_dict(py_dict)
df_dict1
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
name age sex
0 Annie 7 female
1 Lee Sin 36 male
2 Leona 27 female
3 Timo 15 male
py_record = [{"name":"Annie", "age":7, "sex": "female"}, 
             {"name":"Lee Sin", "age":36, "sex": "male"}, 
             {"name":"Leona", "age":27, "sex": "female"}, 
             {"name":"Timo", "age": 15, "sex": "male"}
            ]
df_record = pd.DataFrame(py_record)
df_record
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
name age sex
0 Annie 7 female
1 Lee Sin 36 male
2 Leona 27 female
3 Timo 15 male
df_record1 = pd.DataFrame.from_records(py_record)
df_record1
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
name age sex
0 Annie 7 female
1 Lee Sin 36 male
2 Leona 27 female
3 Timo 15 male

从excel/csv/json等 中读入

pd.read_excel()
pd.read_csv()
...

直接从数据库中读

import pymysql
mysql_cn= pymysql.connections.Connection(host='localhost', port=3306,user='root', password='123456', database='demodb')
df = pd.read_sql('select * from user;', con=mysql_cn)
mysql_cn.close()
df
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
id name age sex
0 1 Annie 7 female
1 2 Lee Sin 36 male
2 3 Leona 27 female
3 4 Timo 15 male

index的用途

把数据存储于普通的column也能用于数据查询,那么使用index有什么好处?
index的用途总结:
1.更方便的数据查询
2.使用index可以获得性能提升

df_dmsc_raw = pd.read_csv('./DMSC.csv')
df_dmsc_raw.head()
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
ID Movie_Name_EN Movie_Name_CN Crawl_Date Number Username Date Star Comment Like
0 0 Avengers Age of Ultron 复仇者联盟2 2017-01-22 1 然潘 2015-05-13 3 连奥创都知道整容要去韩国。 2404
1 1 Avengers Age of Ultron 复仇者联盟2 2017-01-22 2 更深的白色 2015-04-24 2 非常失望,剧本完全敷衍了事,主线剧情没突破大家可以理解,可所有的人物都缺乏动机,正邪之间、... 1231
2 2 Avengers Age of Ultron 复仇者联盟2 2017-01-22 3 有意识的贱民 2015-04-26 2 2015年度最失望作品。以为面面俱到,实则画蛇添足;以为主题深刻,实则老调重弹;以为推陈出... 1052
3 3 Avengers Age of Ultron 复仇者联盟2 2017-01-22 4 不老的李大爷耶 2015-04-23 4 《铁人2》中勾引钢铁侠,《妇联1》中勾引鹰眼,《美队2》中勾引美国队长,在《妇联2》中终于... 1045
4 4 Avengers Age of Ultron 复仇者联盟2 2017-01-22 5 ZephyrO 2015-04-22 2 虽然从头打到尾,但是真的很无聊啊。 723
df_movie_id = df_dmsc_raw\
.filter(['Movie_Name_CN'])\
.drop_duplicates(['Movie_Name_CN'],keep='first')\
.reset_index(drop=True)
df_movie_id = df_movie_id.assign(movie_id=df_movie_id.index)
df_movie_id.head()
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
Movie_Name_CN movie_id
0 复仇者联盟2 0
1 大鱼海棠 1
2 美国队长3 2
3 十二生肖 3
4 九层妖塔 4
df_dmsc = df_dmsc_raw.merge(df_movie_id, on=['Movie_Name_CN'])
df_dmsc.head()
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
ID Movie_Name_EN Movie_Name_CN Crawl_Date Number Username Date Star Comment Like movie_id
0 0 Avengers Age of Ultron 复仇者联盟2 2017-01-22 1 然潘 2015-05-13 3 连奥创都知道整容要去韩国。 2404 0
1 1 Avengers Age of Ultron 复仇者联盟2 2017-01-22 2 更深的白色 2015-04-24 2 非常失望,剧本完全敷衍了事,主线剧情没突破大家可以理解,可所有的人物都缺乏动机,正邪之间、... 1231 0
2 2 Avengers Age of Ultron 复仇者联盟2 2017-01-22 3 有意识的贱民 2015-04-26 2 2015年度最失望作品。以为面面俱到,实则画蛇添足;以为主题深刻,实则老调重弹;以为推陈出... 1052 0
3 3 Avengers Age of Ultron 复仇者联盟2 2017-01-22 4 不老的李大爷耶 2015-04-23 4 《铁人2》中勾引钢铁侠,《妇联1》中勾引鹰眼,《美队2》中勾引美国队长,在《妇联2》中终于... 1045 0
4 4 Avengers Age of Ultron 复仇者联盟2 2017-01-22 5 ZephyrO 2015-04-22 2 虽然从头打到尾,但是真的很无聊啊。 723 0
df_dmsc.count()
ID               2125056
Movie_Name_EN    2125056
Movie_Name_CN    2125056
Crawl_Date       2125056
Number           2125056
Username         2124907
Date             2125056
Star             2125056
Comment          2125056
Like             2125056
movie_id         2125056
dtype: int64
df_dmsc_index = df_dmsc.set_index("movie_id", drop=False)
df_dmsc_index.head()
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
ID Movie_Name_EN Movie_Name_CN Crawl_Date Number Username Date Star Comment Like movie_id
movie_id
0 0 Avengers Age of Ultron 复仇者联盟2 2017-01-22 1 然潘 2015-05-13 3 连奥创都知道整容要去韩国。 2404 0
0 1 Avengers Age of Ultron 复仇者联盟2 2017-01-22 2 更深的白色 2015-04-24 2 非常失望,剧本完全敷衍了事,主线剧情没突破大家可以理解,可所有的人物都缺乏动机,正邪之间、... 1231 0
0 2 Avengers Age of Ultron 复仇者联盟2 2017-01-22 3 有意识的贱民 2015-04-26 2 2015年度最失望作品。以为面面俱到,实则画蛇添足;以为主题深刻,实则老调重弹;以为推陈出... 1052 0
0 3 Avengers Age of Ultron 复仇者联盟2 2017-01-22 4 不老的李大爷耶 2015-04-23 4 《铁人2》中勾引钢铁侠,《妇联1》中勾引鹰眼,《美队2》中勾引美国队长,在《妇联2》中终于... 1045 0
0 4 Avengers Age of Ultron 复仇者联盟2 2017-01-22 5 ZephyrO 2015-04-22 2 虽然从头打到尾,但是真的很无聊啊。 723 0
df_dmsc_index.index
Int64Index([ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
            ...
            27, 27, 27, 27, 27, 27, 27, 27, 27, 27],
           dtype='int64', name='movie_id', length=2125056)

根据查询数据

df_dmsc_index.loc[5].head()
df_dmsc_index.loc[5].tail()
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
ID Movie_Name_EN Movie_Name_CN Crawl_Date Number Username Date Star Comment Like movie_id
movie_id
5 292854 CUG King of Heroes 大圣归来 2017-01-03 1 凌晓疯 2015-07-12 4 有人说挺《小时代》的人都将在电影史耻辱柱上有一席之地。那么给《大圣归来》的打一星的人也是如... 12359 5
5 292855 CUG King of Heroes 大圣归来 2017-01-03 2 taoxinxu释凡 2015-07-05 4 京剧+摇滚+大话西游配乐,孙猴如何解印、老师傅咋来悬空寺是败笔,但有气魄、胆识、干劲、瑕不... 5853 5
5 292856 CUG King of Heroes 大圣归来 2017-01-03 3 三体重症患者 2015-07-05 4 四星。1.甩开《超能陆战队》这种屎片几百条大街。2.西游记新编,无论从故事创作还是动画特效... 5483 5
5 292857 CUG King of Heroes 大圣归来 2017-01-03 4 hogdeer 2015-07-01 1 实在不喜欢这种病毒式宣传方式,上映前一堆人在各大网站洗脑,电影怎么怎么好,哭成狗,官方没钱... 4185 5
5 292858 CUG King of Heroes 大圣归来 2017-01-03 5 影志 2015-07-03 2 造型太杂(结尾大蠕虫甚至恶心和吓人),角色形象cos痕迹明显(《超能陆战队》反派、《大话西... 3526 5
df_dmsc_index.iloc[4]
ID                                    4
Movie_Name_EN    Avengers Age of Ultron
Movie_Name_CN                    复仇者联盟2
Crawl_Date                   2017-01-22
Number                                5
Username                        ZephyrO
Date                         2015-04-22
Star                                  2
Comment               虽然从头打到尾,但是真的很无聊啊。
Like                                723
movie_id                              0
Name: 0, dtype: object

使用index可以获得性能提升

1.如果index是唯一的,Pandas会使用哈希表优化,查询性能为O(1)
2.如果index不是唯一的,但是有序,Pandas会使用二分查找算法,查询性能为O(logN)
3.如果index是完全随机的,那么每次查询都要扫描全表,查询性能为O(N)

%%time
# 根据index查询
df_dmsc_index.loc[5].head()
CPU times: user 384 µs, sys: 26 µs, total: 410 µs
Wall time: 401 µs
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
ID Movie_Name_EN Movie_Name_CN Crawl_Date Number Username Date Star Comment Like movie_id
movie_id
5 292854 CUG King of Heroes 大圣归来 2017-01-03 1 凌晓疯 2015-07-12 4 有人说挺《小时代》的人都将在电影史耻辱柱上有一席之地。那么给《大圣归来》的打一星的人也是如... 12359 5
5 292855 CUG King of Heroes 大圣归来 2017-01-03 2 taoxinxu释凡 2015-07-05 4 京剧+摇滚+大话西游配乐,孙猴如何解印、老师傅咋来悬空寺是败笔,但有气魄、胆识、干劲、瑕不... 5853 5
5 292856 CUG King of Heroes 大圣归来 2017-01-03 3 三体重症患者 2015-07-05 4 四星。1.甩开《超能陆战队》这种屎片几百条大街。2.西游记新编,无论从故事创作还是动画特效... 5483 5
5 292857 CUG King of Heroes 大圣归来 2017-01-03 4 hogdeer 2015-07-01 1 实在不喜欢这种病毒式宣传方式,上映前一堆人在各大网站洗脑,电影怎么怎么好,哭成狗,官方没钱... 4185 5
5 292858 CUG King of Heroes 大圣归来 2017-01-03 5 影志 2015-07-03 2 造型太杂(结尾大蠕虫甚至恶心和吓人),角色形象cos痕迹明显(《超能陆战队》反派、《大话西... 3526 5
%%time
# 根据columns查询
df_dmsc_index[df_dmsc_index['movie_id']==5].head()
CPU times: user 24.3 ms, sys: 4.58 ms, total: 28.9 ms
Wall time: 31.9 ms
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
ID Movie_Name_EN Movie_Name_CN Crawl_Date Number Username Date Star Comment Like movie_id
movie_id
5 292854 CUG King of Heroes 大圣归来 2017-01-03 1 凌晓疯 2015-07-12 4 有人说挺《小时代》的人都将在电影史耻辱柱上有一席之地。那么给《大圣归来》的打一星的人也是如... 12359 5
5 292855 CUG King of Heroes 大圣归来 2017-01-03 2 taoxinxu释凡 2015-07-05 4 京剧+摇滚+大话西游配乐,孙猴如何解印、老师傅咋来悬空寺是败笔,但有气魄、胆识、干劲、瑕不... 5853 5
5 292856 CUG King of Heroes 大圣归来 2017-01-03 3 三体重症患者 2015-07-05 4 四星。1.甩开《超能陆战队》这种屎片几百条大街。2.西游记新编,无论从故事创作还是动画特效... 5483 5
5 292857 CUG King of Heroes 大圣归来 2017-01-03 4 hogdeer 2015-07-01 1 实在不喜欢这种病毒式宣传方式,上映前一堆人在各大网站洗脑,电影怎么怎么好,哭成狗,官方没钱... 4185 5
5 292858 CUG King of Heroes 大圣归来 2017-01-03 5 影志 2015-07-03 2 造型太杂(结尾大蠕虫甚至恶心和吓人),角色形象cos痕迹明显(《超能陆战队》反派、《大话西... 3526 5
测试一:完全随机的顺序查询
# 将数据随机打散
from sklearn.utils import shuffle
df_shuffle = shuffle(df_dmsc_index)
df_shuffle.head()
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
ID Movie_Name_EN Movie_Name_CN Crawl_Date Number Username Date Star Comment Like movie_id
movie_id
18 1288438 The Ghouls 寻龙诀 2017-01-25 16775 赵扑倒 2015-12-20 4 陈坤真他妈帅 真他妈帅气逼人 真他妈帅气逼死人 赞美三主演 0 18
13 968051 My Sunshine 何以笙箫默 2017-01-30 26263 Rievcer 2015-05-01 2 基本无亮点 可能是我电视剧先入为主的缘故 感觉电影版内容太跳跃 人物太空洞 但本来就是抱着... 0 13
16 1144707 The Avengers 复仇者联盟 2017-01-22 75641 Ryan 2013-03-07 4 Marvel!Marvel!!Marvel!!!无条件喜欢~ 0 16
16 1119355 The Avengers 复仇者联盟 2017-01-22 48662 大屁股平躺腰疼 2015-05-13 4 最后一个彩蛋太搞了 0 16
12 908354 Lost In Thailand 泰囧 2017-01-06 52291 Novocain 2013-01-02 4 觉得没《人再囧途》,也缺少了那种感动。 0 12
# 索引是否递增
df_shuffle.index.is_monotonic_increasing
False
# 索引是否唯一
df_shuffle.index.is_unique
False
%%time 
df_shuffle.loc[5].head()
CPU times: user 47.9 ms, sys: 7.38 ms, total: 55.3 ms
Wall time: 111 ms
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
ID Movie_Name_EN Movie_Name_CN Crawl_Date Number Username Date Star Comment Like movie_id
movie_id
5 377449 CUG King of Heroes 大圣归来 2017-01-03 86133 淡了 2016-10-01 5 0 5
5 335084 CUG King of Heroes 大圣归来 2017-01-03 43056 头号精神病 2015-10-02 5 不可避免有些抄袭的影子,或者应该称之为借鉴吧。但是确实看到了很大的希望。 0 5
5 294744 CUG King of Heroes 大圣归来 2017-01-03 1926 十月 2015-07-30 3 支持国产动画越来越好。 0 5
5 409124 CUG King of Heroes 大圣归来 2017-01-03 119064 一念成佛 2015-07-14 5 翻贴吧发现有些人喷大圣里的boss抄袭《千与千寻》里的无脸男,简直不能忍!!现在的人连自己... 0 5
5 402517 CUG King of Heroes 大圣归来 2017-01-03 112277 no-one 2015-07-18 5 大圣归来太赞了!每一帧的风景都美哭,本来很担心照搬西游记的剧情结果非常惊喜,配乐有中国特色... 0 5
测试二:将index排序后查询
df_sort = df_shuffle.sort_index()
df_sort.head()
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
ID Movie_Name_EN Movie_Name_CN Crawl_Date Number Username Date Star Comment Like movie_id
movie_id
0 19778 Avengers Age of Ultron 复仇者联盟2 2017-01-22 20677 泼猴 2015-05-13 4 眼里只有寡姐! 0 0
0 32780 Avengers Age of Ultron 复仇者联盟2 2017-01-22 34251 stellazhangcr7 2015-05-26 3 可能因为没看过漫威的系列漫画,对几位超级英雄的影片也不是很了解,感觉这部电影就是眼花缭乱的... 0 0
0 1206 Avengers Age of Ultron 复仇者联盟2 2017-01-22 1414 小花明日香 2015-04-30 4 我在眼拙没认出来克里斯埃文斯就是当年神奇四侠里面的火人的情况下再度迷上了他,这好像那个两度... 0 0
0 42983 Avengers Age of Ultron 复仇者联盟2 2017-01-22 44967 不会物理 2016-03-07 4 观众朋友们,我们想死你啦。看完别走,之后几部电影的票钱先交一下。 0 0
0 30687 Avengers Age of Ultron 复仇者联盟2 2017-01-22 32086 说唱俑 2015-05-16 3 影院版的字幕翻译太low,笑点都没译出来,奥创太弱,显得复联也很弱,后面创造出的那个玩意是... 0 0
# 索引是否递增
df_sort.index.is_monotonic_increasing
True
# 索引是否唯一
df_sort.index.is_unique
False
%%time 
df_sort.loc[5].head()
CPU times: user 419 µs, sys: 26 µs, total: 445 µs
Wall time: 435 µs
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
ID Movie_Name_EN Movie_Name_CN Crawl_Date Number Username Date Star Comment Like movie_id
movie_id
5 345768 CUG King of Heroes 大圣归来 2017-01-03 53897 空爪 2015-07-20 3 想了想还是三星吧,效果在国漫里算良心,但不能忽视自己在影院差点睡着的事实 0 5
5 415455 CUG King of Heroes 大圣归来 2017-01-03 125485 mikolovetony 2015-07-13 5 自来水怎么了?给好片子打满分怎么了?你们这都没看过的一星喜欢什么?“青春”撕逼小时代123... 0 5
5 303786 CUG King of Heroes 大圣归来 2017-01-03 11223 AlmostHuman 2015-07-15 4 槽点满满但是每当小刀会序曲响起的时候整个人就废了!!!大圣真心帅我一脸!快22了居然在电影... 0 5
5 416993 CUG King of Heroes 大圣归来 2017-01-03 127039 Confidence 2015-07-12 5 非常棒的一部电影,对西游记里的人物关系进行了一些改编,但是你又不会觉得很离谱。更重要的是他... 0 5
5 371043 CUG King of Heroes 大圣归来 2017-01-03 79621 爱鲸鱼的十三郎 2016-07-11 5 时隔一年把影评补上,爱了大圣这么久,感到依旧在。大圣归来很棒!诚意之做 1 5

自动的数据对齐功能

df1 = pd.DataFrame([1, 2,3], index=['a', 'b', 'c'], columns=['A'])
df1
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
A
a 1
b 2
c 3
df2 = pd.DataFrame([4,5,6], index=['b', 'c', 'd'],columns=['A'])
df2
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
A
b 4
c 5
d 6
df1 + df2
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
A
a NaN
b 6.0
c 8.0
d NaN
df.fillna(0)

数据重塑-合并(merge)

pandas的merge,相当于sql的join,将不同的表按key关联到一个表

merge语法

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
         left_index=False, right_index=False, sort=True,
         suffixes=('_x', '_y'), copy=True, indicator=False,
         validate=None)```<br>
*how:连接方式,默认为inner,可设为inner/outer/left/righ,对应sql里的inner join/outer join/left join/ right join<br>*
*on:根据某个字段进行连接,必须存在于两个DateFrame中(若未同时存在,则需要分别使用left_on 和 right_on 来设置)<br>*
*left_on:左连接,以DataFrame1中用作连接键的列<br>*
*right_on:右连接,以DataFrame2中用作连接键的列<br>*
*left_index:bool, default False,将DataFrame1行索引用作连接键<br>*
*right_index:bool, default False,将DataFrame2行索引用作连接键<br>*
*sort:根据连接键对合并后的数据进行排列,默认为True<br>*
*suffixes:对两个数据集中出现的重复列,新数据集中加上后缀 _x, _y 进行区别<br>*

*https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.merge.html*

#### 以inner为例

##### pandas 实现


```python
%%time
df_result = pd.merge(df_dmsc_raw, df_movie_id, on=['Movie_Name_CN'], how='inner')
df_result.head()
CPU times: user 1.12 s, sys: 195 ms, total: 1.32 s
Wall time: 1.37 s
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
ID Movie_Name_EN Movie_Name_CN Crawl_Date Number Username Date Star Comment Like movie_id
0 0 Avengers Age of Ultron 复仇者联盟2 2017-01-22 1 然潘 2015-05-13 3 连奥创都知道整容要去韩国。 2404 0
1 1 Avengers Age of Ultron 复仇者联盟2 2017-01-22 2 更深的白色 2015-04-24 2 非常失望,剧本完全敷衍了事,主线剧情没突破大家可以理解,可所有的人物都缺乏动机,正邪之间、... 1231 0
2 2 Avengers Age of Ultron 复仇者联盟2 2017-01-22 3 有意识的贱民 2015-04-26 2 2015年度最失望作品。以为面面俱到,实则画蛇添足;以为主题深刻,实则老调重弹;以为推陈出... 1052 0
3 3 Avengers Age of Ultron 复仇者联盟2 2017-01-22 4 不老的李大爷耶 2015-04-23 4 《铁人2》中勾引钢铁侠,《妇联1》中勾引鹰眼,《美队2》中勾引美国队长,在《妇联2》中终于... 1045 0
4 4 Avengers Age of Ultron 复仇者联盟2 2017-01-22 5 ZephyrO 2015-04-22 2 虽然从头打到尾,但是真的很无聊啊。 723 0
python 实现
dmsc_raw_set = df_dmsc_raw.to_dict(orient="records")
movie_id_set = df_movie_id.to_dict(orient="records")
def dict_merge(dmsc_raw_set, movie_id_set):
    result_list = []
    for movie_comment in dmsc_raw_set:
        for movie_id in movie_id_set:
            if movie_comment['Movie_Name_CN'] == movie_id['Movie_Name_CN']:
                movie_comment.update({'movie_id': movie_id['movie_id']})
                result_list.append(movie_comment)
    return result_list
%%time
result_list = dict_merge(dmsc_raw_set, movie_id_set)
result_list[:5]
CPU times: user 8.95 s, sys: 652 ms, total: 9.6 s
Wall time: 9.84 s





[{'ID': 0,
  'Movie_Name_EN': 'Avengers Age of Ultron',
  'Movie_Name_CN': '复仇者联盟2',
  'Crawl_Date': '2017-01-22',
  'Number': 1,
  'Username': '然潘',
  'Date': '2015-05-13',
  'Star': 3,
  'Comment': ' 连奥创都知道整容要去韩国。',
  'Like': 2404,
  'movie_id': 0},
 {'ID': 1,
  'Movie_Name_EN': 'Avengers Age of Ultron',
  'Movie_Name_CN': '复仇者联盟2',
  'Crawl_Date': '2017-01-22',
  'Number': 2,
  'Username': '更深的白色',
  'Date': '2015-04-24',
  'Star': 2,
  'Comment': ' 非常失望,剧本完全敷衍了事,主线剧情没突破大家可以理解,可所有的人物都缺乏动机,正邪之间、妇联内部都没什么火花。团结-分裂-团结的三段式虽然老套但其实也可以利用积攒下来的形象魅力搞出意思,但剧本写得非常肤浅、平面。场面上调度混乱呆板,满屏的铁甲审美疲劳。只有笑点算得上差强人意。',
  'Like': 1231,
  'movie_id': 0},
 {'ID': 2,
  'Movie_Name_EN': 'Avengers Age of Ultron',
  'Movie_Name_CN': '复仇者联盟2',
  'Crawl_Date': '2017-01-22',
  'Number': 3,
  'Username': '有意识的贱民',
  'Date': '2015-04-26',
  'Star': 2,
  'Comment': ' 2015年度最失望作品。以为面面俱到,实则画蛇添足;以为主题深刻,实则老调重弹;以为推陈出新,实则俗不可耐;以为场面很high,实则high劲不足。气!上一集的趣味全无,这集的笑点明显刻意到心虚。全片没有任何片段给我有紧张激动的时候,太弱了,跟奥创一样。',
  'Like': 1052,
  'movie_id': 0},
 {'ID': 3,
  'Movie_Name_EN': 'Avengers Age of Ultron',
  'Movie_Name_CN': '复仇者联盟2',
  'Crawl_Date': '2017-01-22',
  'Number': 4,
  'Username': '不老的李大爷耶',
  'Date': '2015-04-23',
  'Star': 4,
  'Comment': ' 《铁人2》中勾引钢铁侠,《妇联1》中勾引鹰眼,《美队2》中勾引美国队长,在《妇联2》中终于……跟绿巨人表白了,黑寡妇用实际行动告诉了我们什么叫忠贞不二;而且为了治疗不孕不育连作战武器都变成了两支验孕棒(坚决相信快银没有死,后面还得回来)',
  'Like': 1045,
  'movie_id': 0},
 {'ID': 4,
  'Movie_Name_EN': 'Avengers Age of Ultron',
  'Movie_Name_CN': '复仇者联盟2',
  'Crawl_Date': '2017-01-22',
  'Number': 5,
  'Username': 'ZephyrO',
  'Date': '2015-04-22',
  'Star': 2,
  'Comment': ' 虽然从头打到尾,但是真的很无聊啊。',
  'Like': 723,
  'movie_id': 0}]
len(result_list)
2125056
df_result.shape
(2125056, 11)
⚠️ **GitHub.com Fallback** ⚠️