excel 使用的数据
# -*- coding: utf-8 -*-
# create time : 2021-05-28 16:27
# author : CY
# file : data_frame.py
# modify time:
import json
import openpyxl
import pandas
def data_frame_start():
"""学习DataFrame
前提:我从excel中读取下面的数据
name sex id_num phone
1 张一一 男 512902197002080001 18160120001
2 李二二 女 512902197002080002 18160120002
3 王三三 男 512902197002080003 18160120003
4 赵四四 男 512902197002080004 18160120004
5 冯五五 男 512902197002080005 18160120005
那么前面的 12345 就是在excel 中 他们的索引(行) 姓名 身份证号码等 就是他们的列名称
"""
file_path = r"C:\Users\CY\Desktop\worker.xlsx"
wb1 = openpyxl.load_workbook(filename=file_path)
sheets = wb1.sheetnames # 获取所有的表格
sheet_name_dict = {
'worker_info': {'row': 6, 'col': 4}
}
data_frame_list = []
data_frame_dict = {}
for sheet in sheets:
if sheet not in sheet_name_dict.keys():
continue
else:
max_row = sheet_name_dict[sheet]['row']
max_col = sheet_name_dict[sheet]['col']
ws = wb1[sheet]
'''读取行'''
for row in ws.iter_rows(min_row=1, min_col=1, max_col=max_col, max_row=max_row):
info_list = [read_data.value for read_data in row]
data_frame_list.append(info_list)
'''读取列'''
for col in ws.iter_cols(min_row=1, min_col=1, max_col=max_col, max_row=max_row):
col_info_list = [read_data.value for read_data in col]
'''
print(col_info_list)
['name', '张一一', '李二二', '王三三', '赵四四', '冯五五']
['sex', '男', '女', '男', '男', '男']
['id_num', '512902197002080001', '512902197002080002', '512902197002080003', '512902197002080004', '512902197002080005']
['phone', 18160120001, 18160120002, 18160120003, 18160120004, 18160120005]
'''
data_frame_dict[col_info_list[0]] = col_info_list[1:]
'''通过数组创建'''
# df = pandas.DataFrame(data_frame_list)
'''
0 1 2 3
0 name sex id_num phone
1 张一一 男 512902197002080001 18160120001
2 李二二 女 512902197002080002 18160120002
3 王三三 男 512902197002080003 18160120003
4 赵四四 男 512902197002080004 18160120004
5 冯五五 男 512902197002080005 18160120005
'''
'''通过字典创建'''
# df = pandas.DataFrame(data_frame_dict)
'''
name sex id_num phone
0 张一一 男 512902197002080001 18160120001
1 李二二 女 512902197002080002 18160120002
2 王三三 男 512902197002080003 18160120003
3 赵四四 男 512902197002080004 18160120004
4 冯五五 男 512902197002080005 18160120005
'''
'''两个出现的结果 大概相同,为啥呢?
通过list创建的,行索引(index)与列索引(columns)没有指定,产生了自动生成的索引,是把name sex 等key 当成了 使用的数据
通过dict 创建 同样是 行索引没有指定,但是它列索引默认是使用dict 的key,
'''
'''把list 改成与dict 相同'''
df = pandas.DataFrame(data_frame_list[1:], columns=data_frame_list[0])
'''
name sex id_num phone
0 张一一 男 512902197002080001 18160120001
1 李二二 女 512902197002080002 18160120002
2 王三三 男 512902197002080003 18160120003
3 赵四四 男 512902197002080004 18160120004
4 冯五五 男 512902197002080005 18160120005
'''
'''列:增 改 删 查'''
df['job'] = ['11', '22', '33', '', 55]
df['job'] = ['11', '22', '33', '44', '']
df.pop('job')
print(df['name'])
'''
0 张一一
1 李二二
2 王三三
3 赵四四
4 冯五五
'''
'''行:增 改 查 删'''
df.loc[5] = ['钱六六', '女', '512902197002080006', '18160120005']
df.loc[5] = ['孙六六', '女', '512902197002080006', '18160120005']
print(df.loc[5])
print(df.index)
'''
name 孙六六
sex 女
id_num 512902197002080006
phone 18160120005
Name: 5, dtype: object
'''
df.drop(labels=[5], inplace=True)
'''或者'''
# df = df.drop(index=5)
'''
labels 就是要删除的行列的名字,用列表给定
axis 默认为0,指删除行,因此删除columns时要指定axis=1;
index 直接指定要删除的行
columns 直接指定要删除的列
inplace=False,默认该删除操作不改变原数据,而是返回一个执行删除操作后的新dataframe;
inplace=True,则会直接在原数据上进行删除操作,删除后无法返回。
'''
'''同理 只想更换某个单元数据'''
df.iat[0, 0] = '张一二'
print(df)
print(df.iat[0, 0])
'''把数据写进worker_write.xlsx'''
file_path_write_excel = r"C:\Users\CY\Desktop\worker_write.xlsx"
sheet_name = 'write_info'
df.to_excel(file_path_write_excel, sheet_name=sheet_name)
'''把数据写进worker_write.json'''
file_path_write_json = r"C:\Users\CY\Desktop\worker_write.json"
df.to_json(file_path_write_json, orient='records')
with open(file_path_write_json, 'r') as file_json:
read_json_info = json.load(file_json)
print(read_json_info)
'''df.to**自己去尝试吧'''
'''遍历读取DataFrame 按行 iterrows'''
for index, row in df.iterrows():
print(type(row['name']))
print(row['name'], row['sex'], row['id_num'], row['phone'])
'''按行遍历 itertuples'''
for row in df.itertuples():
print(row)
print(type(getattr(row, 'name')))
print(getattr(row, 'name'), getattr(row, 'sex'), getattr(row, 'id_num'), getattr(row, 'phone'))
'''
print(row)
Pandas(Index=0, name='张一二', sex='男', id_num='512902197002080001', phone=18160120001)
print(type(getattr(row, 'name')))
<class 'str'>
getattr() 函数用于返回一个对象属性值
getattr(object, name[, default])
object -- 对象。
name -- 字符串,对象属性。
default -- 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。
'''
'''按列遍历 iteritems'''
for key, col_value in df.iteritems():
for sub_col_value in col_value.iteritems():
print(type(sub_col_value))
print(key, sub_col_value[1])
'''
<class 'tuple'>
name 张一二
<class 'tuple'>
name 李二二
<class 'tuple'>
name 王三三
<class 'tuple'>
name 赵四四
'''
if __name__ == '__main__':
data_frame_start()