以下是记录自己数据分析的一次历程,包括使用pandas进行数据去重、筛选、合并、获取目录内容进行匹配,其中遇到了数据表的存储和重新获取以固定表结构。包括两个表的合并,合并后数据字段的修改、筛选。最后将结果使用Matplotlib进行绘图,分别绘制柱状图和饼状图,过程中遇到如何显示中文标签,柱状图数目,如何优化图像等问题并逐一解决。
1. 数据去重
import numpy
import pandas as pd
data = pd.read_excel('data.xlsx')
#按照name1,name2,time进行去重
data.drop_duplicates(subset=['name1','name2','time'],keep='first',inplace=True)
2. 筛选出现两次及以上
#获取数据,某一列数据出现2次及以上
df = data.groupby('name2 ').filter(lambda x: len(x) > 1)
3. 按照指令列的值进行排序
#按照某两列值排序
df.sort_values(by=['name2','tiem'])
4. 获取某个属性数据最后一列
#数据保存,得到新表df1
df1 = df.sort_values(by=['name1','time'])
df1.to_excel('D:/Notebook/data1.xlsx',index = False)
df1 = pd.read_excel('D:/Notebook/data1.xlsx')
#读取并获得排序后的每一个数据最后一个
df2 = pd.read_excel('D:/Notebook/data1.xlsx')
df2.drop_duplicates(subset=['name1'],keep='last',inplace=True)
df2.to_excel('D:/Notebook/result.xlsx',index = False)
df2 = pd.read_excel('D:/Notebook/result.xlsx')
5. 关键词匹配
#关键词匹配
import os
import numpy as np
dir = "D:/Notebook/keywords/"
keywordfilenames = []
for filename in os.listdir(dir):
if filename.endswith(".csv"):
keywordfilenames.append(filename)
else:
continue
keyworddict = {}
for fname in keywordfilenames:
keyworddict[fname.split(".")[0]] = np.concatenate(pd.read_csv(dir + fname).values)
npdata = df2.values
projs = []
for item in npdata:
s = ""
for ggc, cz in keyworddict.items():
count = 0
for kz in cz:
try:
if item[5].find(kz) != -1:
count += 1
except:
pass
if count != 0:
s = ggc
projs.append(s)
print(projs)
7. 匹配结果写入表格
df2["dw"] = pd.DataFrame(projs)
8.?两个结果表,按照某一列进行合并,并提取需要字段?
o2o_merge = pd.merge(df1, df2, on = ['name2'], how='left')
result = o2o_merge[['name1','name2','name3']]
9.?合并结果字段名称修改
result.rename(columns={'name1':'a','name2':'b','name3':'c'},inplace=True)
10.?数据筛选,得到想要结果
#数据筛选,得到想要结果
import os
#获取当前月和日
import datetime
i = datetime.datetime.now()
os.mkdir('D:/Notebook/{}'.format(i.month,i.day))
xz = result.loc[result['dw']=='xz']
print('xz')
print(xz)
bb = result.loc[result['dw']=='bb']
print('bb')
print(bb)
xuzhou.to_excel('D:/Notebook/0428/xz.xlsx',index = False)
bengbu.to_excel('D:/Notebook/0428/bb.xlsx',index = False)
11. 获取条目数和去重结果?
total = result.loc[result['dw'] != '']['name1'].count()
people = len(result.loc[result[‘dw'] != '']['name1'].unique())
12. 结果绘制柱状图?
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
#显示中文
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
x = ['xz','bb']
y = [len(xz['name1'].unique()),len(bb['name1'].unique())]
index = np.array(x)
plt.title('{}月{}日分布情况(人数)'.format(i.month,i.day))
# plt.xlabel('人数')
plt.ylabel('人数')
#显示标签数量
plt.bar(x=index, height=y, width=0.5, bottom=0, color='red')
for a,b in zip(x, y):
plt.text(a,b,
b,
ha='center',
va='bottom',fontsize=10)
plt.show()
#图像优化
plt.style.use('ggplot')
?13.?结果绘制饼状图?
plt.axes(aspect=1)
plt.pie(y,labels=x,autopct='%.2f%%')
plt.title(' {}月{}日分布'.format(i.month,i.day))
plt.show()
备注:
比对表data1的某一列是否出现在表data2的某一列
data1[data1['name'].isin(data2['name'])]
|