Pandas处理excel的基本操作

浪尽此生 提交于 2020-02-27 06:27:29

0x01背景

最近帮某人处理财务相关的excel表格, 顺便学习了一下pandas处理excel的方式方法,汇总如下,希望后面可以能够拿来直接使用。最大的感受就是python处理excel,是对excel公式的降维打击

0x02操作

2.1 pandas安装

这里把简单说下安装,因为pip install的方式一般会报错,快速的解决方式是通过conda来安装, 参考

2.2 处理excel的常用操作

打开excel

import pandas as pd


df = pd.read_excel(XLS_FILENAME, sheet_name)
## 如果你要处理的表格只有少数几列数据,可以用下面的方式打开
def read_xls(sheet_name=None, col1=0, col2=0):
    if col1 == 0 and col2 == 0:
        usecols = None
    else:
        usecols = [col1, col2]
    df = pd.read_excel(XLS_FILENAME, usecols=usecols,
                       names=None, sheet_name=sheet_name, keep_default_na=False)
    return df

读取sheet_name

# 方法一 ,直接获取
def get_sheet_names(_file=XLS_FILENAME):
    xl = pd.ExcelFile(_file)
    return xl.sheet_names

# 方法二,打开获取,读取所有的sheet,  将sheetname设置为None.  这时候得到的是一个dict结果.
def get_sheet_names(_file=XLS_FILENAME):
    df = pandas.read_excel(_file, None);
    return df.keys()

读取行列

    print(df.columns)  #查看列名
    print(df.dtypes)    #查看各列数据类型
    print(df.columns.values) # 打印列名列表
    # 三种方法读取第n行: ix,loc,iloc,均可以用来定位行列,区别见总结
    data = df.ix[n-1].values  # 0表示第一行 这里读取数据并不包含表头
    data = df.loc[n-1].values
    data = df.iloc[n-1, :].values
    # 读取第n列
    data = df.iloc[:, n-1].values
    print("读取指定行的数据:\n{0}".format(data))
    print df.index.values
    
    # 读取第x1-x2行, y1-y2行的数据, x,y从0开始
    data = df.iloc[x1:x2, y1:y2]
    # 读取第x行,第y列的值
    data = df.iloc[x-1, y-1]
   

行列运算

行列运算也就是excel里面的那些公式处理差不多,为了方便快速运算,

常用的函数有sum, map, apply, applymap

    # 第n列的值*2
    print df.iloc[:, n-1].map(lambda x: x*2)
    # 第n列的值求和
    print df.iloc[:, n-1].map(lambda x: x*2)
    # 两列相乘,如下,第2列和4列相乘,放到第4列
    df.iloc[:, 3] = df.apply(lambda x: x[1] * x[3], axis=1)
    # 对第n列累加求和
    print df.iloc[:, n-1].sum()
    # 将DataFrame中所有的值保留两位小数显示
    df.applymap(lambda x:"%.2f" % x)
    

DataFrame操作

# 生成dataFrame
def write_excel(filename, ):
    data = []
    df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    print df
    data = [[1, 2, 3], [4, 5, 6], [7, 8, 'aaa']]
    df = pd.DataFrame(data=data,
                      # index=[0,'exp2','exp3'],
                      columns=['col1', 'col2', 'col3', ])
    print(df)
    df.to_excel(filename, index=False, header=None) # 写入excel的时候不写行号和表头

# 针对指定行做插入或者删除操作 插入列
df.insert(0,'column_name',[11,12,13,14,15]) 
# 在表头插入空行,要用pd.Series(),不能用None
above = df.loc[:0]
below = df.loc[0:]
df = above.append(pd.Series(), ignore_index=True).append(below, ignore_index=True)

axis轴的用法

#按行求和
df['row_sum'] = df.apply(lambda x: x.sum(), axis=1)
#按列求和
df.loc['col_sum'] = df.apply(lambda x: x.sum())

0x03 总结

  1. iloc只能通过行号索引 , df.iloc[0] 是对的, 而df.iloc['a'] 是错误的。loc 和 ix 大部分时候行为都差不多, 但是当假如某个行的索引标签就是一个 INT 比如 1 的时候, loc 优先将 df.loc[1] 理解为行标签为 1 的索引, 而 df.ix[1] 优先将其理解为 行号为 1 的索引(就是第二行), 为了避免不小心犯错误, 建议:
  • 当用行号索引的时候, 尽量用 iloc 来进行索引;

  • 用标签索引的时候用 loc

  1. map和apply可以快速处理,axis控制处理的方向,默认是0,纵向处理
  2. 写入excel就是将最终处理好的dataFrame写入即可

0x04 参考

1.dataframe的一些操作

2.dataframe插入行列

4. ix,loc,iloc区别

5.map,apply,applaymap用法

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!