image.png

官方网站:https://pandas.pydata.org/docs/ 中文网站:http://www.pypandas.cn/

隔行插入空行

隔行插入.gif
测试.xlsx 手动插入空行
测试.xlsx 原始excel

实现V1:

隔行插入空行(暂未实现):

列索引变化

https://zhuanlan.zhihu.com/p/137051777

way1

添加一个排序列sort,可以和range一致
通过 df[‘new_col1’] = 5 在末尾插入新的数据行,并设置指定列的值,比如拆分编码
遍历新增后,再通过sort列排序完成最终操作。

way2

切割dataFrame,append行后,再concat

  1. def insert(df, i, df_add):
  2. # 指定第i行插入一行数据
  3. df1 = df.iloc[:i, :]
  4. df2 = df.iloc[i:, :]
  5. df_new = pd.concat([df1, df_add, df2], ignore_index=True)
  6. return df_new
  7. data = {
  8. 'name':['li', 'gg', 'zz'],
  9. 'age':[20, 21, 22],
  10. 'height':[170, 178, 174]}
  11. df = pd.DataFrame(data)
  12. print('df:')
  13. print(df)
  14. df_add = pd.DataFrame({'name':['yy'], 'age':[25], 'height':[168]})
  15. # 在第2行插入一条新的数据
  16. df_new = insert(df, 1, df_add)
  17. print('df_new:')
  18. print(df_new)
  19. """
  20. df:
  21. name age height
  22. 0 li 20 170
  23. 1 gg 21 178
  24. 2 zz 22 174
  25. df_new:
  26. name age height
  27. 0 li 20 170
  28. 1 yy 25 168
  29. 2 gg 21 178
  30. 3 zz 22 174
  31. """

拆解列,给指定列赋值:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Time : 2022-01-11 20:04
  4. # @Author : yx.Jiang
  5. # @File : excel_update.py
  6. # @Software: PyCharm
  7. import pandas as pd
  8. from pandas import DataFrame
  9. def read_excel(path='测试.xlsx'):
  10. # DataFrame
  11. df = pd.read_excel(path, sheet_name="Sheet1")
  12. # 最大行数
  13. # rows = df.shape[0]
  14. # 最大列数
  15. # cols = df.columns.size
  16. # 获取【商家id】列
  17. series = df['商家id']
  18. # for val in series.values:
  19. # print(val)
  20. # a = val.split('+')
  21. # print(a)
  22. for item in series.items():
  23. index = item[0] + 1
  24. if index == len(list(series.items())):
  25. break
  26. raw_code = item[1]
  27. # 跳过空列
  28. if (not (type(raw_code) is float)) and raw_code.find('+') != -1:
  29. split_tuple = raw_code.split('+')
  30. df.loc[index-1, '商家id'] = split_tuple[0]
  31. df.loc[index, '商家id'] = split_tuple[1]
  32. df.loc[index+1, '商家id'] = split_tuple[2]
  33. return df
  34. if __name__ == '__main__':
  35. data = read_excel()
  36. print(data)
  37. DataFrame(data).to_excel('update.xlsx', sheet_name='Sheet1', index=False, header=True)

实现V2:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Time : 2022/1/17 10:36
  4. # @Author : yx.Jiang
  5. # @File : interlaced_insertion_blank_line.py
  6. import pandas as pd
  7. from pandas import DataFrame
  8. def insert(df, i, df_add):
  9. # 指定第i行插入一行数据
  10. df1 = df.iloc[:i, :]
  11. df2 = df.iloc[i:, :]
  12. df_new = pd.concat([df1, df_add, df2], ignore_index=True)
  13. return df_new
  14. def read_excel(path='测试.xlsx', sheet_name="Sheet1"):
  15. if sheet_name is None:
  16. sheet_name = 'Sheet1'
  17. df_dict = pd.read_excel(path, sheet_name)
  18. df = DataFrame(df_dict, index=range(len(df_dict)))
  19. businesses = df['商家id']
  20. names = df['姓名']
  21. ages = df['年龄']
  22. headers = df.head(0).columns # Index(['姓名', '年龄', '商家id', 'Unnamed: 3'], dtype='object')
  23. length = len(list(businesses.items())) # 数据行长度
  24. index = 0 # 原始数据下标
  25. insert_index = 0 # 插入行下标
  26. for item in businesses.items():
  27. insert_index += 1
  28. # print(f'index: {index}, length: {length} , insert_index: {insert_index}')
  29. if index >= length:
  30. break
  31. raw_code = item[1]
  32. if raw_code.find('+') != -1:
  33. split_tuple = raw_code.split('+') # 需要拆解的列
  34. df.loc[insert_index - 1, '商家id'] = split_tuple[0] # 修改原始行
  35. # 新增行
  36. df_add1 = DataFrame(
  37. {headers[0]: [names[index]], headers[1]: [ages[index]], headers[2]: [split_tuple[1]]},
  38. index=range(0, 1))
  39. df = insert(df, insert_index, df_add1)
  40. df_add2 = DataFrame(
  41. {headers[0]: [names[index]], headers[1]: [ages[index]], headers[2]: [split_tuple[2]]},
  42. index=range(0, 1))
  43. insert_index += 1
  44. df = insert(df, insert_index, df_add2)
  45. index += 1
  46. insert_index += 1
  47. return df
  48. if __name__ == '__main__':
  49. path = ''
  50. while path is None or path == '':
  51. path = str(input("请输入excel的路径及名称[如:C:/Users/Administrator/Desktop/测试.xlsx]:"))
  52. if path.find('/') != -1:
  53. path = path.replace("/", "\\")
  54. st_name = str(input("请输入Sheet名称[如:Sheet1(默认)]:"))
  55. if st_name == '':
  56. st_name = None
  57. data = read_excel(path, st_name)
  58. DataFrame(data).to_excel('update.xlsx', sheet_name='Sheet1', index=False, header=True)

打包exe

使用pyinstaller打包
命令:Pyinstaller -F interlaced_insertion_blank_line.py -i excel.ico
需要将icon的格式转为ico格式设置程序的icon;
命令执行之后,如下:
image.png
进入dist目录执行可执行程序:
image.png

解决:进入path\Anaconda3\envs\py37\Library\bin 目录下找到 mkl_intel_thread.1.dll 文件 复制至dist目录下,再次执行可执行程序

image.png
按提示输入参数即可:update.xlsx即为生成的excel
image.png
image.png

扩展

image.pngimage.png

来源: loc和iloc的区别