鱼C论坛

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

排序问题,

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

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

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

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

     姓名            岗位          类型                详细

8   张三(测试)  办公室  ...   产假               产假6天
9   张三(测试)  办公室  ...   婚假               婚假3天
4   张三(测试)  办公室  ...  工伤假               工伤2天
6   张三(测试)  办公室  ...  工伤假               工伤2天
11  张三(测试)  办公室  ...  工伤假              工伤假3天
12  张三(测试)  办公室  ...   年假               年假3天
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

df = pd.DataFrame(data)

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

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

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

print(df)

当你运行这个代码之后,你的DataFrame应该会按照你定义的顺序美滋滋地排好了:
姓名    岗位   类型        详细
4  张三(测试)  办公室  工伤假  工伤假2天
6  张三(测试)  办公室  工伤假  工伤假2天
11 张三(测试)  办公室  工伤假  工伤假3天
9  张三(测试)  办公室   婚假  婚假3天
8  张三(测试)  办公室   产假  产假6天
12 张三(测试)  办公室   年假  年假3天

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

如果我用openpyxl,类型列如果是工伤假,那么一整行的字体就变成红色,如果是年假,一整行的字体就变成蓝色,得怎么弄
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

先安装 `openpyxl` 库(如果你还没有安装的话):
pip install openpyxl

接下来就是代码实现部分,我们一步步来!
from openpyxl import load_workbook
from openpyxl.styles import Font

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

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

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

    for cell in row:
        cell.font = font_color

# 保存修改后的 Excel 文件
wb.save('修改后的Excel文件路径.xlsx')

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

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

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

   for cell in row:
       cell.font = font_color

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> 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 设置排序

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

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

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

df = pd.DataFrame(data)

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

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

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

print(sorted_df)
这样做可以避免“SettingWithCopyWarning”警告。

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

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

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

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

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

    for cell in row:
        cell.font = font_color

# 保存修改后的 Excel 文件
wb.save('修改后的Excel文件路径.xlsx')

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 20:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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