今天, 实现了一个对excel表格操作的技术方案.
操作的要求是:
(1)在一个目标表格(表格2)中的第2列已经有唯一标识码.第1列为凭证号, 但是是空的.
(2)在数据表格中(表格1)中有资产的信息, 其中第2列是资产的唯一标识码, 第1列是凭证号.
(3)表格2内只有部分资产.
要求:
从表格1中的找到与表格2中唯一标识码一样的资产凭证号, 将表格2中的资产凭证号填写完整.
方法:
遍历表格2中的每一行, 找到该行的唯一标识码, 然后从表格1中找到该唯一标识码的行, 将这行的凭证号赋值为表格一的当前遍历行.
需要的库
pandas 和 openpyxl
下载安装命令:
bash
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas openpyxl
代码实现
python
import pandas as pd
# 加载Excel文件
df = pd.read_excel('表格1.xlsx', engine='openpyxl') #打开表格1文件
df2=pd.read_excel('表格2.xlsx', engine='openpyxl') #打开表格2文件
for index, row in df2.iterrows(): #遍历表格2中的所有行
#print(row[1])
#print(df.loc[df.iloc[:,1]==row.iloc[1],df.columns[0]].values[0])
#value=df.loc[df.iloc[:,1]==row.iloc[1],df.columns[0]]
#将当前行的第1列赋值为表格1中第2列的值与该行第2列值相同的行的第1列值
#即:在表格1中找到第2列与当前行第2列相同的行 df.iloc[:,1]==row.iloc[1]
# 然后获得找到的行的第1列的值 df.loc[df.iloc[:,1]==row.iloc[1],df.columns[0]].values[0]
# 赋值给当前行的第1列 df2.loc[index,df2.columns[0]]=。。。
df2.loc[index,df2.columns[0]]=df.loc[df.iloc[:,1]==row.iloc[1],df.columns[0]].values[0]
df2.to_excel('表格2_g.xlsx', index=False, engine='openpyxl') #将df2重新写入文件
excel操作代码知识
DataFrame
pd.read_excel函数或pd.DataFrame可以创建DataFrame对象:
python
df = pd.read_excel('工作簿1.xlsx', engine='openpyxl')
df2 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})
type(df)
type(df2)
输出:
powershell
<class 'pandas.core.frame.DataFrame'>
选择或索引数据
DataFrame.loc和DataFrame.iloc
loc使用标签来索引;
iloc使用序号(0为开始序号)来索引.
索引行:
python
df.loc[0] # 行的标签就是行号, 从0开始
df.iloc[0]
索引列:
python
df2.loc[:,'B']
df2.iloc[:,1]
loc和iloc在切片时(如df.loc[0:2, 'A']或df.iloc[0:2, 0])的行为略有不同。loc的切片是包含结束标签的(左闭右闭区间),而iloc的切片是不包含结束位置的(左闭右开区间):
python
df.loc[0:2, 'A']
上面代码输出:
powershell
0 1
1 2
2 3
Name: A, dtype: int64
python
df.iloc[0:2, 0]
上面代码输出:
powershell
0 1
1 2
Name: A, dtype: int64
切片的类型是Series类: <class 'pandas.core.series.Series'>
打开excel文件
python
dfs = pd.read_excel('工作簿1.xlsx', sheet_name=None, engine='openpyxl')
返回一个dict, 包含所有工作表;
没有sheet_name参数: 返回第一个工作表, 类型DataFrame
返回指定的一个或多个工作表: 如sheet_name='Sheet1', sheet_name=['Sheet1','Sheet2'], 指定一个表是返回DataFrame类型, 指定多个表时,返回dict类型
工作表使用名称索引
python
df=dfs['Sheet1']