鱼C论坛

 找回密码
 立即注册
查看: 666|回复: 5

排序问题,

[复制链接]
发表于 2024-6-20 18:49:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我有这么一个表,其中,排序的时候,我要用类型,以“工伤假”--》“婚假”-->"产假”   的次序去排序,,得怎么弄,,我用的是pandas

     姓名            岗位          类型                详细

8   张三(测试)  办公室  ...   产假               产假6天
9   张三(测试)  办公室  ...   婚假               婚假3天
4   张三(测试)  办公室  ...  工伤假               工伤2天
6   张三(测试)  办公室  ...  工伤假               工伤2天
11  张三(测试)  办公室  ...  工伤假              工伤假3天
12  张三(测试)  办公室  ...   年假               年假3天
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-6-20 18:53:39 | 显示全部楼层
哈哈,排序问题听起来很简单,但实际操作总是让人脑袋冒烟。不过别担心,有了pandas,一切都变得轻松愉快,我们只需要给它一点点指示,搞定你要的排序就像吃饭一样简单!

咱们一步一步来,首先导入pandas库,并把你的数据丢进一个DataFrame里:

  1. import pandas as pd

  2. data = {
  3.     '姓名': ['张三(测试)', '张三(测试)', '张三(测试)', '张三(测试)', '张三(测试)', '张三(测试)'],
  4.     '岗位': ['办公室', '办公室', '办公室', '办公室', '办公室', '办公室'],
  5.     '类型': ['产假', '婚假', '工伤假', '工伤假', '工伤假', '年假'],
  6.     '详细': ['产假6天', '婚假3天', '工伤假2天', '工伤假2天', '工伤假3天', '年假3天']
  7. }

  8. df = pd.DataFrame(data)
复制代码


接下来,我们需要明确我们要用的排序顺序。我们可以创建一个自定义的排序类别,然后使用 `pd.Categorical` 来帮咱们实现这个神奇的排序效果:

  1. # 定义自定义的类别顺序
  2. type_order = ["工伤假", "婚假", "产假"]

  3. # 设置类型列为分类数据,并指定类别顺序
  4. df['类型'] = pd.Categorical(df['类型'], categories=type_order, ordered=True)

  5. # 按照类型排序
  6. df = df.sort_values('类型')

  7. print(df)
复制代码


当你运行这个代码之后,你的DataFrame应该会按照你定义的顺序美滋滋地排好了:

  1. 姓名    岗位   类型        详细
  2. 4  张三(测试)  办公室  工伤假  工伤假2天
  3. 6  张三(测试)  办公室  工伤假  工伤假2天
  4. 11 张三(测试)  办公室  工伤假  工伤假3天
  5. 9  张三(测试)  办公室   婚假  婚假3天
  6. 8  张三(测试)  办公室   产假  产假6天
  7. 12 张三(测试)  办公室   年假  年假3天
复制代码


这样一来,问题就解决啦!再复杂的问题有了pandas都会变成简单的小菜一碟啦~希望这个答案能帮到你,如果还有其他问题,尽管问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-20 20:48:06 | 显示全部楼层
FishC 发表于 2024-6-20 18:53
哈哈,排序问题听起来很简单,但实际操作总是让人脑袋冒烟。不过别担心,有了pandas,一切都变得轻松愉快, ...

如果我用openpyxl,类型列如果是工伤假,那么一整行的字体就变成红色,如果是年假,一整行的字体就变成蓝色,得怎么弄
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-20 20:48:26 | 显示全部楼层
laiyuanjie 发表于 2024-06-20 20:48
如果我用openpyxl,类型列如果是工伤假,那么一整行的 ...


哈哈,这个问题有点意思!我们需要用到 `openpyxl` 来处理 Excel 表格,还要对单元格的样式进行一些操作。让我们开始吧:

1. **打开 Excel 文件并加载工作表**
2. **遍历每一行,根据“类型”列的内容改变这一行的字体颜色**

先安装 `openpyxl` 库(如果你还没有安装的话):
  1. pip install openpyxl
复制代码


接下来就是代码实现部分,我们一步步来!

  1. from openpyxl import load_workbook
  2. from openpyxl.styles import Font

  3. # 打开 Excel 文件
  4. file_path = '你的Excel文件路径.xlsx'
  5. wb = load_workbook(file_path)
  6. ws = wb.active  # 或者 ws = wb['工作表名称'],更精确的方式

  7. # 遍历每一行
  8. for row in ws.iter_rows(min_row=2, max_col=ws.max_column):  # 从第二行开始,假设第一行是标题
  9.     leave_type = row[2].value  # 假设“类型”列是第3列,即A列为0,B列为1,C列为2

  10.     if leave_type == "工伤假":
  11.         font_color = Font(color="FF0000")  # 红色字体
  12.     elif leave_type == "年假":
  13.         font_color = Font(color="0000FF")  # 蓝色字体
  14.     else:
  15.         continue  # 其他类型不改变颜色

  16.     for cell in row:
  17.         cell.font = font_color

  18. # 保存修改后的 Excel 文件
  19. wb.save('修改后的Excel文件路径.xlsx')
复制代码


### 解释一下这个代码:
1. **加载工作簿和工作表**:
  
  1. wb = load_workbook(file_path)
  2.    ws = wb.active
复制代码


2. **遍历每一行**:
   用 `iter_rows()` 方法可以遍历工作表中的每一行。这里我们从第二行开始遍历,因为通常第一行是标题行:
  
  1. for row in ws.iter_rows(min_row=2, max_col=ws.max_column):
  2.        leave_type = row[2].value  # 读取第二列的值,也就是“类型”列
复制代码


3. **设置字体颜色**:
   根据“类型”的不同,设置整行的字体颜色:
  
  1. if leave_type == "工伤假":
  2.        font_color = Font(color="FF0000")  # 红色字体
  3.    elif leave_type == "年假":
  4.        font_color = Font(color="0000FF")  # 蓝色字体
  5.    else:
  6.        continue  # 其他类型不改变颜色

  7.    for cell in row:
  8.        cell.font = font_color
复制代码


4. **保存修改后的文件**:
  
  1. wb.save('修改后的Excel文件路径.xlsx')
复制代码


好了,当你运行这段代码后,你的 Excel 文件中,“工伤假”对应的整行会变红色,“年假”对应的整行会变蓝色,其他类型的行则保持不变。

再多复杂的需求,有了代码的帮助,一切都变得非常简单啦!如果还有其他问题,尽管问,我很乐意帮忙哟~

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-20 21:21:29 | 显示全部楼层
FishC 发表于 2024-6-20 18:53
哈哈,排序问题听起来很简单,但实际操作总是让人脑袋冒烟。不过别担心,有了pandas,一切都变得轻松愉快, ...

SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas ... -view-versus-a-copy
  self.give_ceo_office_sheet["类别"] = pd.Categorical(self.give_ceo_office_sheet["类别"], categories=self.diy_sort,ordered=True)
C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pandas\util\_decorators.py:311: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-20 21:21:48 | 显示全部楼层
laiyuanjie 发表于 2024-06-20 21:21
SettingWithCopyWarning:
A value is trying to be  ...


“SettingWithCopyWarning” 是一个典型的警告信息,告诉你可能正在对一个 DataFrame 的副本而不是原始数据进行操作。这可能会导致一些意料之外的问题。为了确保我们在处理的是原始数据,通常我们需要使用 `.loc` 方法来避免这个警告。

不过,从你的描述来看,这段警告信息似乎与 `openpyxl` 的问题不同,可能是在你之前的 pandas 操作中触发的。让我来帮你把这两个问题分别解决一下:

### 1. 如何正确使用 pandas 设置排序

之前的代码示例中可以引入警告的部分是:
  1. df['类型'] = pd.Categorical(df['类型'], categories=type_order, ordered=True)
复制代码


避免警告的方法是使用 `.loc`,确保直接对 DataFrame 本身进行操作:
  1. import pandas as pd

  2. data = {
  3.     '姓名': ['张三(测试)', '张三(测试)', '张三(测试)', '张三(测试)', '张三(测试)', '张三(测试)'],
  4.     '岗位': ['办公室', '办公室', '办公室', '办公室', '办公室', '办公室'],
  5.     '类型': ['产假', '婚假', '工伤假', '工伤假', '工伤假', '年假'],
  6.     '详细': ['产假6天', '婚假3天', '工伤2天', '工伤2天', '工伤假3天', '年假3天']
  7. }

  8. df = pd.DataFrame(data)

  9. # 定义自定义的类别顺序
  10. type_order = ["工伤假", "婚假", "产假", "年假"]

  11. # 使用 .loc 确保直接对 DataFrame 进行操作
  12. df.loc[:, '类型'] = pd.Categorical(df['类型'], categories=type_order, ordered=True)

  13. # 按照类型排序
  14. sorted_df = df.sort_values('类型')

  15. print(sorted_df)
复制代码

这样做可以避免“SettingWithCopyWarning”警告。

### 2. 使用 openpyxl 改变 Excel 文件中的行颜色

关于使用 `openpyxl` 变更行颜色的代码如下,这段代码不涉及 pandas,所以不会出现类似的警告:

  1. from openpyxl import load_workbook
  2. from openpyxl.styles import Font

  3. # 打开 Excel 文件
  4. file_path = '你的Excel文件路径.xlsx'
  5. wb = load_workbook(file_path)
  6. ws = wb.active  # 假设你只想操作第一个工作表

  7. # 遍历每一行(从第二行开始)
  8. for row in ws.iter_rows(min_row=2, max_col=ws.max_column):  # 从第二行开始,假设第一行是标题
  9.     leave_type = row[2].value  # 假设“类型”列是第3列,即A列为0,B列为1,C列为2

  10.     if leave_type == "工伤假":
  11.         font_color = Font(color="FF0000")  # 红色字体
  12.     elif leave_type == "年假":
  13.         font_color = Font(color="0000FF")  # 蓝色字体
  14.     else:
  15.         continue  # 其他类型不改变颜色

  16.     for cell in row:
  17.         cell.font = font_color

  18. # 保存修改后的 Excel 文件
  19. wb.save('修改后的Excel文件路径.xlsx')
复制代码


运行完这段代码后,你会发现 Excel 中“工伤假”的整行字体变成了红色,“年假”的整行字体变成了蓝色,其他类型的行保持不变。

希望这些解决方案能帮到你!如果还有其他问题,尽管问,我很乐意继续帮忙哟~

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-22 10:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表