Python3 pd.merge()使用实例

本文想要将各个国家的恐怖袭击次数(频率),按照国家编号,依次赋给原始数据中113249条记录。
Python3 pd.merge()使用实例_第1张图片
实现如下效果:
Python3 pd.merge()使用实例_第2张图片

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#读入数据
data=pd.read_excel('E:/E盘备份/C盘jupyter代码备份/C2018/data/C2018mathmodel.xlsx')
columns=data.columns.tolist()
df1=data[['country','latitude','longitude']]
df1.isnull().any() #查看缺失值
df2=df1[~df1['latitude'].isnull() | ~df1['longitude'].isnull()]
df3=df2.sort_values(by=df2.columns.tolist(),axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last') 
zzhou=list(df3.groupby(['country']))
color_energy=[]
for i in range(len(zzhou)):
    color_energy.append([zzhou[i][0],zzhou[i][1].shape[0]])
#df3['frequence']=0
#del df3['frequence']
df3.index=range(df3.shape[0])
prizedCount=df3['country'].value_counts(ascending=True)
#将原来的国家编号作为索引的索引部分放到属性列表中。
prizedCount=prizedCount.reset_index().rename(columns={'index':'country_No'})
prizedCount=prizedCount.sort_values(by=['country_No'],axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last') 
prizedCount.index=range(prizedCount.shape[0])
prizedCount.rename(columns=lambda x:x.replace('country','frequence'), inplace=True)
prizedCount.rename(columns=lambda x:x.replace('frequence_No','country'), inplace=True)
result=pd.merge(df3,prizedCount) #有相同的键(country),即可融合数据

"""如下两种方法都太慢了"""
"""
#构造一个list,在转换为DataFrame
TTxinxi=[]
for i in range(len(df3)):
    xinxi=[]
    for j in  range(len(prizedCount)):
        if df3['country'][i]==prizedCount['country_No'][j]:
            xinxi.append(df3['country'][i])
            xinxi.append(df3['latitude'][i])
            xinxi.append(df3['longitude'][i])
            xinxi.append(prizedCount['country'][j])
        else:
            continue
    TTxinxi.append(xinxi)
#另一种想法
for i in range(len(df3)):
    for j in  range(len(prizedCount)):
        if df3['country'][i]==prizedCount['country_No'][j]:
            df3['frequence'][i]=prizedCount['country'][j]
        else:
            continue
"""

import mpl_toolkits.basemap
import matplotlib.pyplot as plt 
plt.subplots(figsize=(20,9))
basemap = mpl_toolkits.basemap.Basemap()
basemap.drawcoastlines()
basemap.drawcountries(linewidth=1.5)
cm = plt.cm.get_cmap('RdYlBu')
#cm = plt.cm.get_cmap('gist_rainbow')
#直接将频率赋给颜色作为能量渐变值
sc=plt.scatter(result['longitude'], result['latitude'], c=range(len(result)), vmin=0, vmax=24368, s=7,cmap=cm) 
plt.savefig('D:/world.png')
plt.rcParams['font.sans-serif']=['SimHei'] #标题不能显示汉字,这么处理
plt.title('1998-2017世界恐怖袭击案发地分布图')
plt.legend() #这里怎么写???
plt.colorbar(sc)
plt.show()

#cm = plt.cm.get_cmap('RdYlBu')
#xy = range(20)
#z = xy
#sc = plt.scatter(xy, xy, c=z, vmin=0, vmax=20, s=35, cmap=cm)
#plt.colorbar(sc)
#plt.show()

pd.merge()适用于两个DataFrame类型的数据表具有公共的属性列,通过属性列的关联可以获得两个表的公共数据部分。

你可能感兴趣的:(Python,华为杯数学建模)