目录
Series
pd.Series(data,index,dtype)
data是传入的数据(可以直接传入字典,键值对自动形成索引和数据),index是索引
例子
import pandas as pd
pd.Series([10,20,30,40,50],index=[1,2,3,4,5])
DataFrame
pd.DataFrame(data,index,columns)
index是行标签,columns是列标签,不填写默认建立0-N索引
例子
score_df=np.random.randint(40,100,(10,5))
subject=['语文','数学','英语','生物','化学']
stu=['同学'+str(i) for i in range(score_df.shape[0])]
data1=pd.DataFrame(score,index=stu,columns=subject)
data1
显示前或后几行内容
data.head(5) #显示前5行内容
data.tail(5) #显示后5行内容
修改行列索引值
注:必须整体修改不能只修改其中一项
stu=['学生_'+str(i) for i in range(score_df.shape[0])]
data1.index=stu
data1
重设索引
可以加参数drop=True,如果加入,则删除原来的索引值
data1.reset_index()
data1.reset_index(drop=True)
某列值设置为新的索引
set_index(keys,drop=True)
keys是列索引名
例子
data1.set_index('语文',drop=True)
排序
键排序
df.sort_values(by,ascending)
by是排序参考的键,ascending=False降序,ascending=True升序,默认升序
索引排序
df.sort_index()
逻辑运算函数
query
用来筛选逻辑关系
data.query('open<24&open>23').head()
isin
data[data['open'].isin([23.53,23.85])]
统计运算
describe
能够直接得出很多统计信息,count,mean,std,min,max等
data.describe()
最大值索引和最小值索引
索引的是下标的位置
data.idxmax(axis=0)
data.idxmin(axis=0)
cumsum
累计求和
stock_rise=data['p_change']
stock_rise.cumsum()
画图
df.plot(kind)
kind是绘制图形的种类
例子
data1.plot(kind='line')
缺失值处理
先判断数据内是否包含NaN
pd.isnull(movie)
pd.notnull(movie)
np.any(movie.isnull())
np.all(movie.notnull())
删除缺失值(当缺失值少)
movie.dropna()
替换缺失值(当缺失值多)
data['column_name'].fillna(data['column_name'].mean(),inplace=True) #用平均值来替换
替换值(当缺失值为?而不为Nan)
wis=wis.replace(to_replace='?',value=np.nan)
数据离散化
将数据划分到不同的区间
平均划分
qcut=pd.qcut(p_change,10)
qcut.value_counts() #计算分到每个组数据个数
10是划分的组数
自定义划分
bins=[-100,-7,-5,-3,0,3,5,7,100]
p_counts=pd.cut(p_change,bins)
p_counts.value_counts() #计算分到每个组数据个数
bins是区间
转换成one-hot编码形式
dummies=pd.get_dummies(p_counts,prefix='rise')
prefix是指分组名字
数据表合并
表拼接
pd.concat([data1,data2])
表连接
pd.merge(data1,data2,on=['key1','key2'],how='inner') #默认内连接,也就是有相等key1和key2的行,才进行连接
还有左连接(参考左表,左表有而右表无的数据也要连接,但没有的部分用NaN代替),右连接(同理),外连接(求的是并集)
交叉表和透视表
交叉表
一列数据对于另一列数据的数量
count=pd.crosstab(data['week'],data['p_n'])
透视表
一列数据对于另一列数据的占比
data.pivot_table(['p_n'],index='week')
分组聚合
df.groupby(key).key1.mean()
key是分组的列数据,可以多个,然后按key1的平均值来聚合
count=data.groupby(['Country']).count()
读csv文件
df_csv=pd.read_csv('./data/data1_try_read.csv',encoding='utf-8')
df_csv
定位
注意:如果不用loc和iloc来定位,则需要先列后行,例如data[列名][行名]
loc
df_csv.loc[1,'城市'] #用行列的名字定位
‘杭州’
iloc
df_csv.iloc[0,0] #用下标来定位
‘北京’
迭代
行迭代(iterrows)
for index,row in df_csv.iterrows():
print('index:',index)
print(row)
print('----------------')
data_list=[]
for index,row in df_csv.iterrows():
temp_list=[row.体重,row.城市,row.年龄,row.猫]
data_list.append(temp_list)
print(data_list)
[[8.5, ‘北京’, 7, ‘波斯’]]
[[8.5, ‘北京’, 7, ‘波斯’], [10.2, ‘杭州’, 1, ‘布偶’]]
[[8.5, ‘北京’, 7, ‘波斯’], [10.2, ‘杭州’, 1, ‘布偶’], [6.8, ‘曼谷’, 4, ‘暹罗’]]
列迭代
df_csv.体重
0 8.5
1 10.2
2 6.8
Name: 体重, dtype: float64
保存csv文件
df_csv.to_csv('./save.csv',encoding='utf-8',index=False,columns=['猫','体重'])
保存猫,体重两列,文件名为save.csv
分词工具
jieba
jieba是一个中文分词工具
import jieba
分词
sen_a='我爱北京天安门, 我也爱吃冰淇淋'
sen_a_seg=jieba.lcut(sen_a)
print('分词结果:',sen_a_seg)
sen_a_seg=[word for word in sen_a_seg if word not in [' ','我',',']]
print('过滤后的结果:',sen_a_seg)
分词结果: [‘我’, ‘爱’, ‘北京’, ‘天安门’, ‘,’, ’ ', ‘我’, ‘也’, ‘爱’, ‘吃’, ‘冰淇淋’]
过滤后的结果: [‘爱’, ‘北京’, ‘天安门’, ‘也’, ‘爱’, ‘吃’, ‘冰淇淋’]
小任务
统计每个单词出现的次数
text_data = '''世界卫生组织秘书长谭德塞13日说,欧洲已成为新冠肺炎“大流行”的“震中”。目前欧洲报告的新冠肺炎确诊和死亡病例超过中国以外其他国家和地区的总和,每天报告的病例比中国疫情流行高峰时还要多。
虽然世卫组织的警钟已经敲得震天响,但是身在“震中”的一些欧洲国家却只是采取了一些轻描淡写的措施,不过,这些“低调”的措施却让本国国民很焦虑。
比如,瑞典公共卫生局12日宣布,将改变新冠病毒检测政策,不再给轻症和疑似患者进行检测。瑞典公共卫生局微生物研究部门负责人维塞尔解释说,只对那些确实需要治疗和已经住院的人进行新冠病毒检测,是为了把有限的资源用于医护人员、已住院患者等高危人群。
这种在病毒面前主动缴械投降,对疫情扩散采取“鸵鸟政策”的做法并非瑞典独有,另外一个欧洲大国英国的做法更是饱受本国民众诟病。
英国政府在疫情加速蔓延之际,于12日宣布疫情应对措施从“遏制”阶段进入“延缓”阶段。进入“延缓”阶段后,政府的目标是尽可能降低疫情带来的影响,并把疫情高峰期出现的时间延后,错开当前流感季,降低本地卫生系统的压力。
具体来说,新措施就是,无论之前是否去过疫情严重的国家,无论是否跟确诊感染者有过接触,出现症状者要在家自我隔离一周。许多民众之前呼吁取消大型公众活动、关闭校园,但这些措施都没有实施。英国首相约翰逊在记者会上淡定地表示,疫情还会继续蔓延,“更多家庭会失去亲人”。
有评论认为,英国政府的延缓战略建立在“群体免疫”原则上,即让更多英国人接触病毒,从而获得群体免疫。很多民众对此感到愤怒,认为这将以牺牲一部分人的生命为代价。《柳叶刀》主编也怒批“政府和公众赌轮盘”。
这些国家的做法完全违背世卫组织的如下建议:做好检测和治疗,为打破传播链,尽早发现、隔离、检测、处理每个病例;隔离病人及其接触者,取消体育赛事,减少社交活动等。
部分欧洲国家为何无视世卫组织的建议,反其道而行之?原因有以下三点:
第一,思想上麻痹大意,过于轻敌,白白浪费了中国付出巨大牺牲为全球抗疫争取的窗口期。在中国暴发疫情初期,很多西方国家隔岸观火,事不关己,高高挂起,在宝贵的窗口期无所作为。而且,一些国家的领导人和专家一再告诉民众,新冠肺炎不过就是“大号流感”,不必恐慌,这种迷之自信的操作白白浪费了至少一二十天时间。更有甚者,很多西方主流媒体和政客被偏见障目,对中国采取的行之有效的管控和隔离措施冷嘲热讽,却没有认识到中国经验行之有效。等灾难降临,疫情迅速蔓延,他们束手无策,只好慌乱之中强装镇定。
第二,很多西方国家的治理模式存在缺陷,导致在一些问题上无法作为。正如瑞典首都斯德哥尔摩地区政府新闻官贝里隆德12日所承认的:“我们已没有可能阻止新冠病毒的传播,也无法跟踪所有被感染的人。”
第三,西方国家虽然言必称人权,经常对别国人权状况指手画脚,但是生命权是最基本、最重要的人权,而很多西方政府在疫情肆虐的当下却漠视这一点,反而以“以金钱为中心”。在危机面前,中国政府为了人民健康,不惜为中国经济按下暂停键,集中精力抗击疫情,最大限度救治患者。但是,很多西方国家很难做到这一点,西方政府和政党背后的利益集团无力承担停产停工造成的经济损失。以至于有英国网民发帖认为,英国政府任由疫情蔓延,就是为了淘汰经济上的弱势群体,置老人和穷人的死活于不顾。
美国总统特朗普在被批评行动不力、应对迟缓多日之后,于13日宣布“国家紧急状态”,以应对疫情。希望某些欧洲国家也能够更快行动起来,集中更多资源,采取更多有力、高效的措施,早日打赢疫情防控战,保障民众健康。'''
tokenized=jieba.lcut(text_data)
tokenized=[word for word in tokenized if word not in [' ',',',',','。','"']]
print(len(tokenized)) #一共有多少单词
743
首先,统计各个单词的类别
方式一
word_set=set(tokenized)
print(len(word_set))
416
方式二
word_list=[]
for word in tokenized:
if word not in word_list:
word_list.append(word)
print(len(word_list))
416
统计每个单词的出现频次
逻辑:
按原始的分词列表进行遍历, 如果该词出现, 则判断:
该词是否已经在统计的词典中, 如果在:
则在对应的词典位置 + 1;
如果不在(说明这个词是第一次出现):
则在词典的key位置设置为该词, 然后设置该词的value为1;
word_fre_dict={}
for word in tokenized:
if word not in word_fre_dict.keys():
word_fre_dict[word]=1
else:
word_fre_dict[word]=word_fre_dict[word]+1
word_fre_dict
初级的转移概率
单词分词后,首先自己转移到自己一般来说没有意义,比如“我”和“我”,其次,一些词比如“我”和“烧烤”,一般也是不会转移的,这时我们需要一个矩阵,矩阵的行和列都是词表种类的长度
sen_1 = '我爱北京天安门'
sen_2 = '我喜欢任贤齐'
sen_3 = '你爱吃烧烤吗'
sen_4 = '我不喜欢吃烧烤, 因为烧烤太油腻了'
sen_5 = '我代表昆明理工大学欢迎新生'
sen_6 = '我喜欢听舒缓的钢琴曲'
sen_7 = '今天天气晴朗, 适合爬山'
sen_8 = '今天天气真好'
sen_list = [sen_1, sen_2, sen_3, sen_4, sen_5, sen_6, sen_7, sen_8]
建立词表
word_list=[]
sen_seg_list=[]
for sen_line in sen_list:
sen_seg=jieba.lcut(sen_line)
sen_seg=[word for word in sen_seg if word not in [',',' ']]
sen_seg_list.append(sen_seg)
print(sen_seg)
for word in sen_seg:
if word not in word_list:
word_list.append(word)
print(len(word_list))
[‘我’, ‘爱’, ‘北京’, ‘天安门’]
[‘我’, ‘喜欢’, ‘任贤齐’]
[‘你’, ‘爱’, ‘吃’, ‘烧烤’, ‘吗’]
[‘我’, ‘不’, ‘喜欢’, ‘吃’, ‘烧烤’, ‘因为’, ‘烧烤’, ‘太’, ‘油腻’, ‘了’]
[‘我’, ‘代表’, ‘昆明’, ‘理工大学’, ‘欢迎’, ‘新生’]
[‘我’, ‘喜欢’, ‘听’, ‘舒缓’, ‘的’, ‘钢琴曲’]
[‘今天’, ‘天气晴朗’, ‘适合’, ‘爬山’]
[‘今天天气’, ‘真’, ‘好’]
31
import numpy as np
transfor_p = np.zeros((len(word_list), len(word_list)))
print('创建好的转移概率矩阵维度为: ', transfor_p.shape)
# 遍历所有句子:
for sen_line in sen_seg_list:
for idx in range(len(sen_line)-1): #用这个方式而不用word in sen_line,是因为这个方式可以不光知道行,还可以知道列(索引),另外一个只能得到词
word = sen_line[idx] #找到当前词
next_word = sen_line[idx+1]
word_idx = word_list.index(word)
next_word_idx = word_list.index(next_word) #索引词表位置
print(word, next_word, word_idx, next_word_idx)
transfor_p[word_idx, next_word_idx] = transfor_p[word_idx, next_word_idx] + 1
print('==========')
max_idx_list = np.argmax(transfor_p, axis=1)
for idx, max_idx in enumerate(max_idx_list):
word = word_list[idx]
relative_word = word_list[max_idx]
print('对于词: ({}), 最大转移概率对应的词为: ({})'.format(word, relative_word))
对于词: (我), 最大转移概率对应的词为: (喜欢)
对于词: (爱), 最大转移概率对应的词为: (北京)
对于词: (北京), 最大转移概率对应的词为: (天安门)
对于词: (天安门), 最大转移概率对应的词为: (我)
对于词: (喜欢), 最大转移概率对应的词为: (任贤齐)
对于词: (任贤齐), 最大转移概率对应的词为: (我)
对于词: (你), 最大转移概率对应的词为: (爱)
对于词: (吃), 最大转移概率对应的词为: (烧烤)
对于词: (烧烤), 最大转移概率对应的词为: (吗)
对于词: (吗), 最大转移概率对应的词为: (我)
对于词: (不), 最大转移概率对应的词为: (喜欢)
对于词: (因为), 最大转移概率对应的词为: (烧烤)
对于词: (太), 最大转移概率对应的词为: (油腻)
对于词: (油腻), 最大转移概率对应的词为: (了)
对于词: (了), 最大转移概率对应的词为: (我)
对于词: (代表), 最大转移概率对应的词为: (昆明)
对于词: (昆明), 最大转移概率对应的词为: (理工大学)
对于词: (理工大学), 最大转移概率对应的词为: (欢迎)
对于词: (欢迎), 最大转移概率对应的词为: (新生)
对于词: (新生), 最大转移概率对应的词为: (我)
对于词: (听), 最大转移概率对应的词为: (舒缓)
对于词: (舒缓), 最大转移概率对应的词为: (的)
对于词: (的), 最大转移概率对应的词为: (钢琴曲)
对于词: (钢琴曲), 最大转移概率对应的词为: (我)
对于词: (今天), 最大转移概率对应的词为: (天气晴朗)
对于词: (天气晴朗), 最大转移概率对应的词为: (适合)
对于词: (适合), 最大转移概率对应的词为: (爬山)
对于词: (爬山), 最大转移概率对应的词为: (我)
对于词: (今天天气), 最大转移概率对应的词为: (真)
对于词: (真), 最大转移概率对应的词为: (好)
对于词: (好), 最大转移概率对应的词为: (我)
电影案例分析
求电影数据中评分平均分,导演人数等信息
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df_csv=pd.read_csv('./data1/IMDB-Movie-Data.csv')
平均分
df_csv.Rating.mean()
6.723199999999999
导演人数
np.unique(df_csv.Director).shape[0]
644
对于这一组电影数据,想知道Rating(评分)的分布情况
plt.figure(figsize=(20,8))
plt.hist(df_csv.Rating.values,bins=20)
max_=df_csv.Rating.max()
min_=df_csv.Rating.min()
t1=np.linspace(min_,max_,num=21)
plt.xticks(t1)
plt.grid()
plt.show()
统计电影genre(分类)情况
注:一部电影有多个类别
思想:
1.创建一个全为0的DataFrame,叫zeros,然后将其列索引设置为电影的分类,叫movie
2.遍历每一部电影,movie中把分类出现的列值置为1
3.求和并排序,然后做图
第一步
temp_list=[i.split(',') for i in df_csv.Genre] #进行字符串切割
genre_list=np.unique([i for j in temp_list for i in j]) #获取电影分类,去掉重复值
zeros=np.zeros([df_csv.shape[0],genre_list.shape[0]]) #创建全为0的DataFrame
movie=pd.DataFrame(zeros,columns=genre_list) #列索引设置为电影的分类
第二步
for i in range(1000):
movie.loc[i,temp_list[i]]=1
第三步
movie.sum().sort_values(ascending=False).plot(kind='bar')