Python数据分析常用操作

Python数据分析:List与Pandas操作详解
本文介绍了Python数据分析中的List操作,包括创建、转换和DataFrame到List的转换。接着详细阐述了Pandas的基础处理,如数据导入、特殊符号删除、数据提取以及时间序列处理。还探讨了数据探索与可视化,包括条形图、折线图和饼图的绘制。总结了List和Pandas的主要操作,并指出了可视化中的遗留问题。

文件系统操作

合并某个目录下所有txt格式文件(这个代码也是参考别人的代码进行了一些修改):

import os
import os.path
import pandas as pd

def MergeTxt(filepath, outfile):
    k = open(filepath + outfile, 'a+', encoding='utf-8')
    for parent, dirnames, filenames in os.walk(filepath):
        for filepath in filenames:
            txtPath = os.path.join(parent, filepath)
            f = open(txtPath, encoding='utf-8')
            k.write(f.read()+"\n")
        k.close()
        print("文件写入完成")
        
if __name__=='__main__':
    filepath="./agriculture_index/"
    outfile = "total1.txt"
    MergeTxt(filepath, outfile)

List创建与转换

1.List创建方法

  • list()
  • 通过**[ ]**直接赋值给变量,如:lis = [1,2,3,4]
  • 列表推导式解析,语法格式如下:
list = [expression for var in range]

应用实例:
绘制地图时需要传入数组对,即传入格式为:[(‘湖南’,5),(’浙江‘,4)]

mrkts = [(i, int(j)) for i,j in zip(y2.index, y2.values)]

2.List元素类型转换

列表中字符串变为整型(浮点型)

y = zj_var['var_num'].to_list()
y_lis = list(map(loat, y))

3.DataFrame转换为List

to_list()tolist()

Pandas数据基础处理

数据导入

读取csv格式文件属于最基础操作,基本语句:

df = pd.read_csv('./total.txt',encoding = 'utf-8', sep = '\t', index_col = False, names=['Date', 'Variety', 'Market', 'low', 'High', 'Mean', 'unit','url' ])

这里面有几点需说明:
1.index_col=False,没有指定index;
2.导入数据没有表头,通过names传入列名的列表。

特殊符号删除(替换)

导入数据中包含一些特殊符号,这份数据中所有特殊符号都在第一位,且只有1个,所以相对好处理,删除了数值前的问号。

tmp1['low']=tmp1['low'].str.lstrip('?')

数据操作

  • 提取前20行,前2列数据
var_cnt_20 = var_cnt.iloc[0:20,0:3]
  • 行数据提取——删除特定属性值的样本
tmp2 = tmp1.drop(index = df[(df['Market'] == "XXXXX")].index.tolist())

删除属性值中前后的中括号,需要的数据格式为:’2016-12-30‘,实际为:[‘2016-12-30’],这一步是因为后面在生成时间序列的时候报错,不能直接转化为日期,用lambda函数和replace暴力转化。

tmp3['Date'] = tmp3['Date'].apply(lambda x: x.replace('[','').replace(']',''))
  • 列数据——数据字段提取
    将某列属性值的前几位(固定长度)提取出来,并生成新的一列,比如这里是从市场名称中提取前2个字符并生成省份这个字段,这个应该有更好的方式,先留在这里作个参考:
province = tmp2['Market']
province = province.astype(str).str[:2]

注意:这里先转化为字符类型,再重新提取的。

时间序列处理

为了后面方便提取指定时间的数据,处理为时间序列数据,并且提取2016年全年数据。

tmp3['Date'] = pd.to_datetime(tmp3['Date']) 
tmp3.set_index("Date", inplace=True)

Date_Descending = tmp3.sort_index(ascending=False)    #按日期降序,日期由大到小
sorted_2016= Date_Descending.truncate(before = '2016-1',after = '2016-12-31')

数据探索

数据准备

以2016-12-30为例:

tmp1 = df.loc['2016-12-30']
#每个市场提供的商品种类数量
tmp1['Market'].value_counts()

product_num = tmp1.groupby('Province')['Variety'].nunique()#各省产品种类数量

#各省市场数量
markrt_num = tmp1.groupby('Province')['Market'].nunique()

concat将各省市场数量和产品种类数量拼接到一个DataFrame中,再次感受到Pandas index的作用

info_by_prov = pd.concat([product_num,markrt_num], axis=1)

可视化

声明:以下可视化代码根据实际情况做了修改,但是主要来自于: https://blog.youkuaiyun.com/weixin_43479815/article/details/121722665
手动感谢,侵权必删

条形图+折线图

def var_num(x,y1,y2):
    bar = (Bar()
           .add_xaxis(x)
           .add_yaxis('农产品种类数量',y1)
           .add_yaxis('市场数量',y2,gap="0%")
           .set_series_opts(label_opts=opts.LabelOpts(font_size=14)) 
            )
    
    line = (Line()
           .add_xaxis(x)
           .add_yaxis('农产品种类数量',y1,
                       markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_='average')]),) 
           .add_yaxis('市场数量',y2,
                      markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_='average')]),) 
           .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) 
      )
 
    bar.overlap(line).render('XXXXXX.html')

绘制地图显示:

def create_china_map():
    (
        Map()
        .add(
            series_name="市场数量", 
            data_pair=mrkts, 
            maptype="china", 
            # 是否默认选中
            is_selected=True
#             label_opts=opts.LabelOpts(is_show=False)
        )
        .set_global_opts(
        # 设置标题
        title_opts=opts.TitleOpts(title="2016年全国各省农产品市场分布"),
        # 设置分段显示
        visualmap_opts=opts.VisualMapOpts(max_=5, is_piecewise=False)
        )
        # 生成本地html文件
        .render("全国各省农产品市场分布.html")
    )

饼图

def pie1(x_data,y_data): 
    (
        #在Pie()中设置背景颜色init_opts=opts.InitOpts(width="1600px", height="800px", bg_color="#2c343c")
        Pie(init_opts=opts.InitOpts(width="1200px", height="600px", background_color='#404a59'))#设置背景颜色
        .add('', [list(z) for z in zip(x_data, y_data)], radius=["40%", "75%"])
        .set_global_opts(
            title_opts=opts.TitleOpts(title="2016年浙江各大型农产品市场种类", subtitle="蔬菜类", title_textstyle_opts=opts.TextStyleOpts(color="#fff")),
            legend_opts=opts.LegendOpts(orient="vertical", pos_top="30%", pos_left="2%"
        ))#设置图例布局,放在上面horizontal,放在下面pos_bottom
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: ({d}%)"))#鼠标触发,{a}:系列名,{b}数据名,{c}数据值,{d}百分比
        .render('2016年浙江各大型农产品市场种类.html')
    )

总结

1.list操作:创建、元素类型转换;
2.Pandas操作:数据筛选(根据特定值,根据数据排列)、数据索引、时间序列操作;
遗留问题:可视化展示部分很多时候直接传入df,数据没有显示,时间关系,还没有找到原因,估计是传参位置的问题,基本都是处理为list分别传入的。

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值