pandas学习及小任务

本文介绍了Pandas库中的Series和DataFrame数据结构,展示了如何显示数据、修改索引、设置新索引、排序、逻辑运算以及统计运算。还涉及了缺失值处理、数据离散化、数据表合并、绘图和中文分词等操作,提供了实例分析。
摘要由CSDN通过智能技术生成

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')

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醋酸洋红就是我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值