python | 工作笔记 | pandas 常用总结

来源:互联网 发布:jsbrowser是什么软件 编辑:程序博客网 时间:2024/06/05 00:27

之前使用pandas处理数据使用的少,最近在实习中经常用到,故自以为把心得总结一番。

说明:有部分是网上查到的案例,觉得很实用,就把它搬过来了。


      • DataFrame的列名
      • concat拼接
      • merge 两个dataframe拼接
      • 计算nan的个数
      • 排序
      • 删除重复记录
      • 使用pandas画图中文显示问题
      • 双坐标轴的图
      • enumerate函数
      • 时间处理
      • 时间转换为周几周月
      • 画图
        • 一个框中框中画多个图
        • 多个子图

1.DataFrame的列名

## 方法一:全部修改df.columns = ['a', 'b', 'c', 'd']df.columns = df.columns.map(lambda x:x[1:])df.columns = df.columns.str.strip('$')## 方法二:可以局部修改df.rename(columns=('$a': 'a','$e': 'e'}, inplace=True)df.rename(columns=lambda x:x.replace('$',''), inplace=True)

2.concat拼接

## concat拼接,我常用于处理单个列或行后将数据拼接在一起。hangye_shouyi_ratio = pd.DataFrame()for i in range(1,16):    data_hangye_indexa = hangye_index.iloc[:,i+1].values - hangye_index.iloc[:,i].values    hangye_shouyi_ratio = pd.concat([hangye_shouyi_ratio,data_hangye_indexa.T],axis=0)

参考网址: http://pandas.pydata.org/pandas-docs/stable/merging.html

3.merge 两个dataframe拼接

# 基于关键词"申万一级行业"拼接两个dataframepd.merge(hangye_index,chaopei,on='申万一级行业')

4.计算nan的个数

## 计算NAN或缺失值的个数df.isnull().sum(axis=1)## 计算非NAN或缺失值的个数df.null().sum(axis=1)

5.排序

## 排序,降序table4.sort_values(by='区间累计涨跌幅',ascending=False)

具体参考:http://www.cnblogs.com/caicaihong/p/5890239.html

6.删除重复记录

## duplicatedfalsei = []for i,x in enumerate(data_liutong.duplicated(keep = 'first')):    if x == False:        falsei.append(i)data_liutong = data_liutong.iloc[falsei,:]data_liutong.head(10)  

注意keep后面的参数使用。keep=‘frist’:除了第一次出现外,其余相同的被标记为重复。keep=’last’:除了最后一次出现外,其余相同的被标记为重复。keep=False:所有相同的都被标记为重复。
具体参考:http://blog.csdn.net/kancy110/article/details/70142728

7.使用pandas画图:中文显示问题

## 建议把这些内容复制过去,可以保证后面有问题的都可以解决掉import matplotlib.pyplot as pltfrom matplotlib.font_manager import FontPropertiesfrom matplotlib.pylab import mplmpl.rcParams['axes.unicode_minus'] = False  # 解决负号显示异常的问题my_font = FontProperties(fname=r"C:\\Windows\\fonts\\SimHei.ttf")  # 使用指定中文字体plt.rc('font', family='SimHei', size=8)

这是我多次尝试后发现的方案,很有效果,强烈推荐使用。

8.双坐标轴的图

## 重点:twinximport matplotlib.pyplot as pltimport numpy as npplt.clf()  # 清空画布fig  = plt.figure(figsize=(8,4))x = pd.date_range('31/3/2013','30/9/2016',freq='3M')data_stock_hangye_sum_ratio[data_stock_hangye_sum_ratio.index == '计算机'].values[0]y1 = hangye_index[hangye_index.iloc[:,0] == '计算机'].iloc[:,2:17].values[0]y2 = data_stock_hangye_sum_ratio[data_stock_hangye_sum_ratio.index == '计算机'].values[0]ax1 = fig.add_subplot(111)ax1.plot(x,hangye_index[hangye_index.iloc[:,0] == '计算机'].iloc[:,2:17].values[0])ax1.set_ylabel('计算机行业指数走势')ax1.set_title('计算机行业行情走势与基金持仓占比变化')ax2 = ax1.twinx()ax2.plot(x,data_stock_hangye_sum_ratio[data_stock_hangye_sum_ratio.index == '计算机'].values[0],'r')#ax2.set_xlim(x)ax2.set_ylabel('计算机行业基金持仓占比')ax2.set_xlabel('时间')plt.show()

9.enumerate函数

for i,x enumerate(data):   print(i)   print (x)

得到下标i和数值x

10.时间处理

## 先将时间的格式统一处理下,再来转换格式print (datetime.strptime('2013-03-29 0:00',"%Y-%m-%d %H:%M").strftime("%Y-%m-%d"))

11.时间转换为周几、周、月

import pandas as pdfrom datetime import datetimecal_date = pd.read_csv("D:\\python\\Scripts\\cal_date.csv")## 几月cal_date['month'] = pd.DatetimeIndex(cal_date.calendarDate).month## 周几cal_date['day'] = pd.DatetimeIndex(cal_date.calendarDate).dayofweek## 这个月的第几周cal_date['week'] = pd.DatetimeIndex(cal_date.calendarDate).week

12.画图

一个框中框中画多个图

import matplotlib.pyplot as pltimport numpy as npx = np.arange(0., np.e, 0.01)y1 = np.exp(-x)y2 = np.log(x)fig = plt.figure()ax1 = fig.add_subplot(111)# ax1 = plt.plot()ax1.plot(x, y1)ax1.set_ylabel('Y values for exp(-x)')ax1.set_title("Double Y axis")ax2 = ax1.twinx()  # this is the important functionax2.plot(x, y2, 'r')ax2.set_xlim([0, np.e])ax2.set_ylabel('Y values for ln(x)')ax2.set_xlabel('Same X for both exp(-x) and ln(x)')plt.show()

这里写图片描述

多个子图

  • 方式一
import matplotlib.font_manager as fmmyfont = fm.FontProperties(fname='C:/Windows/Fonts/msyh.ttc')import matplotlib.pyplot as pltimport numpy as npplt.rc('font', family='SimHei', size=8)import matplotlib.pyplot as plt### 第一张图plt.clf()  # 清空画布plt.figure(figsize=(16,64),dpi=80) plt.subplot(8,2,1)plt.pie(data_stock_hangye_sum_ratio.mean(axis = 1).values,labels=labels,autopct='%1.1f%%',shadow=False, startangle=90,pctdistance = 1.06)plt.ylabel("基金重仓持股行业平均占比情况(2013Q1-2016Q3)",fontproperties=myfont)# 第二张图for i in range(len(date)):    numbers = int(i + 2)    plt.subplot(8,2,numbers)    plt.pie(data_stock_hangye_sum_ratio.iloc[:,i].values,labels=labels,            autopct='%1.1f%%',shadow=False, startangle=90,pctdistance = 1.06)    #plt.xlabel("基金重仓持股行业平均占比情况(2013Q1-2016Q3)",fontproperties=myfont)    plt.ylabel("基金重仓持股行业平均占比情况 "+ date[i],fontproperties=myfont)plt.show()
  • 方式二
import matplotlib.pyplot as pltimport numpy as npimport numpy.random as rnddef f(t):    s1 = np.sin(2 * np.pi * t)    e1 = np.exp(-t)    return np.absolute((s1 * e1)) + .05t = np.arange(0.0, 5.0, 0.1)s = f(t)nse = rnd.normal(0.0, 0.3, t.shape) * sfig = plt.figure(figsize=(12, 6))vax = fig.add_subplot(121)hax = fig.add_subplot(122)vax.plot(t, s + nse, '^')vax.vlines(t, [0], s)vax.set_xlabel('time (s)')vax.set_title('Vertical lines demo')hax.plot(s + nse, t, '^')hax.hlines(t, [0], s, lw=2)hax.set_xlabel('time (s)')hax.set_title('Horizontal lines demo')plt.show()

这里写图片描述

总结:把常用的总结出来,方便自己使用。