鱼C论坛

 找回密码
 立即注册
查看: 245|回复: 7

[已解决]python 处理Excel 代码保存2个Excel表未按照要求显示?

[复制链接]
发表于 2024-5-21 11:32:40 | 显示全部楼层 |阅读模式

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

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

x
last1_data['名称'] = np.where(last1_data['新旧']=='财产',last1_data['种类'],'机动')


last1_data.to_excel("C:/Users/EDY/Desktop/python/最终完整版/5  添加列.xlsx", index=False)

last520_data = pd.read_excel("C:/Users/EDY/Desktop/python/最终完整版/5  添加列.xlsx",dtype=str)

code_name_dict = {
"18006":"类目1",
"0042":"类目2",
"P0010":"类目3",
"L0011":"类目4",
"L0045":"类目5",
"L00012":"类目6",

}
last520_data['名称'] = last520_data['种类'].map(code_name_dict).fillna(last520_data['名称'])

last520_data.to_excel("C:/Users/EDY/Desktop/python/最终完整版/6  最终版.xlsx",index=True,index_label=['序号'])  


帮忙看一下:文件添加列表名称显示机动,保存到6最终版后机动名称有的不显示了,为什么?
最佳答案
2024-5-21 13:51:32
冰菲 发表于 2024-05-21 13:50
只有一个列,就是产品名称,产品名称列,除了中文的不 ...


好的,明白了。如果只有一个列 `产品名称`,我们可以直接对该列进行操作,将代码替换为对应的中文名称。以下是修改后的代码:
import pandas as pd

code_name_dict = {
    'P0061': '类目1',
    'P0037': '类目2',
    'P0006': '类目3',
    'P0001': '类目4',
    # 其他代码...
}

df = pd.read_excel("C:/Users/EDY/Desktop/python/最终完整版/6 最终版.xlsx", dtype=str)

# 使用map函数对产品名称列进行映射
df['产品名称'] = df['产品名称'].map(code_name_dict).fillna(df['产品名称'])

df.to_excel("C:/Users/EDY/Desktop/python/最终完整版/6 最终版.xlsx", index=False)

在这个代码中,我们首先定义了一个字典 `code_name_dict`,将代码和对应的中文名称进行映射。然后使用 `pd.read_excel()` 函数读取原始的 Excel 文件,并将数据存储在名为 `df` 的 DataFrame 中。

接下来,使用 `map()` 函数对 `产品名称` 列进行映射操作,将代码替换为对应的中文名称。如果 `map()` 函数无法找到对应的映射值,我们使用 `fillna()` 函数保持原样不变。

最后,使用 `to_excel()` 函数将修改后的数据保存为 Excel 文件。

希望这次能够解决你的问题!如有任何疑问,请随时提出。

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

使用道具 举报

发表于 2024-5-21 11:33:52 | 显示全部楼层
问题出在这一行代码上:
last520_data = last520_data.map(code_name_dict).fillna(last520_data)

`map()` 函数是用来映射字典的,但是这里你直接将 `last520_data` 进行了映射,并且用 `fillna()` 函数填充了缺失值。这个操作会导致原本的数值被替换成了映射后的值或者保留了原本的值,从而导致不符合预期的结果。

解决方法是只对 `last520_data` 中指定的列进行映射和填充。修改代码如下:
# 只对 '列名' 进行映射和填充
last520_data['列名'] = last520_data['列名'].map(code_name_dict).fillna(last520_data['列名'])

其中 `'列名'` 是你要映射和填充的列名,将其修改为你实际使用的列名。

然后再保存到 Excel 文件中时,注意确保索引也被保存到文件中。修改代码如下:
last520_data.to_excel("C:/Users/EDY/Desktop/python/最终完整版/6 最终版.xlsx", index=True)

这样就可以正确保存包含映射和填充结果的 Excel 文件了。希望能帮到你!

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

使用道具 举报

 楼主| 发表于 2024-5-21 11:43:15 | 显示全部楼层
FishC 发表于 2024-5-21 11:33
问题出在这一行代码上:

名称显示“机动”的时候,名称不变,如果名称显示代码(字母数字)的时候显示类目1/2/3,但是这个代码跑完,本来名称显示“机动”的也不显示了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-21 11:43:25 | 显示全部楼层
冰菲 发表于 2024-05-21 11:43
名称显示“机动”的时候,名称不变,如果名称显示代码 ...


抱歉,我之前给出的解答有误。

原因是在使用 `map()` 函数进行映射时,只对指定的代码进行了映射,而没有对其他值进行处理。导致在填充缺失值时,原本名称显示为“机动”的数据也被替换掉了。

要解决这个问题,可以使用 `apply()` 函数来处理每一行数据,将代码和名称进行映射,并保留原本的名称。修改代码如下:
def map_code_name(row):
    code = row['代码列名']  # 将 '代码列名' 修改为实际的代码列名称
    if code in code_name_dict:
        return code_name_dict[code]
    else:
        return row['名称列名']  # 将 '名称列名' 修改为实际的名称列名称
        
last520_data['名称列名'] = last520_data.apply(map_code_name, axis=1)  # 将 '名称列名' 修改为实际的名称列名称

last520_data.to_excel("C:/Users/EDY/Desktop/python/最终完整版/6 最终版.xlsx", index=True)

其中,`map_code_name()` 函数按行处理数据,如果代码存在于映射字典中,则返回对应的类目名称,否则保留原本的名称。

这样就能正确处理带有代码的行,并保留原本名称的信息。希望这次能够解决你的问题!

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

使用道具 举报

 楼主| 发表于 2024-5-21 13:46:17 | 显示全部楼层
FishC 发表于 2024-5-21 11:43
抱歉,我之前给出的解答有误。

原因是在使用 `map()` 函数进行映射时,只对指定的代码进行了映射, ...

产品名称
机动
P0061
P0037
P0006
P0001
代码列名和名称列名都是改为产品名称吗?最后代码还是代码,没有显示中文名称
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-21 13:46:31 | 显示全部楼层
冰菲 发表于 2024-05-21 13:46
产品名称
机动
P0061
P0037
P0006
P0001
代码列 ...


是的,你理解得对。在处理过程中,确实需要明确代码列和名称列的名称。假设你的代码列名为`product_code`,名称列名为`product_name`,那么代码应该如下:
# 假设product_code列是'P0061',product_name列是'机动'
code_name_dict = {
    'P0061': '类目1',
    # 其他代码...,
    '机动': '机动',  # 保留原本的名称,因为不需要映射
}

last520_data = last520_data.replace({'product_code': code_name_dict}, inplace=True)  # 使用replace函数替换代码列

# 然后将产品名称列(假设为'product_name')保留原样,不需要映射
last520_data['product_name'] = last520_data['product_name']  # 如果有这个列

last520_data.to_excel("C:/Users/EDY/Desktop/python/最终完整版/6 最终版.xlsx", index=True)

这样,`product_code`列的值会被替换为对应的类目名称,而`product_name`列的值保持不变,原始的"机动"也会显示为"机动"。如果`product_name`列是空的,那么它会保留原样,不会被映射。

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

使用道具 举报

 楼主| 发表于 2024-5-21 13:50:21 | 显示全部楼层
FishC 发表于 2024-5-21 13:46
是的,你理解得对。在处理过程中,确实需要明确代码列和名称列的名称。假设你的代码列名为`product_cod ...

只有一个列,就是产品名称,产品名称列,除了中文的不变,代码的显示中文名称
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-21 13:51:32 | 显示全部楼层    本楼为最佳答案   
冰菲 发表于 2024-05-21 13:50
只有一个列,就是产品名称,产品名称列,除了中文的不 ...


好的,明白了。如果只有一个列 `产品名称`,我们可以直接对该列进行操作,将代码替换为对应的中文名称。以下是修改后的代码:
import pandas as pd

code_name_dict = {
    'P0061': '类目1',
    'P0037': '类目2',
    'P0006': '类目3',
    'P0001': '类目4',
    # 其他代码...
}

df = pd.read_excel("C:/Users/EDY/Desktop/python/最终完整版/6 最终版.xlsx", dtype=str)

# 使用map函数对产品名称列进行映射
df['产品名称'] = df['产品名称'].map(code_name_dict).fillna(df['产品名称'])

df.to_excel("C:/Users/EDY/Desktop/python/最终完整版/6 最终版.xlsx", index=False)

在这个代码中,我们首先定义了一个字典 `code_name_dict`,将代码和对应的中文名称进行映射。然后使用 `pd.read_excel()` 函数读取原始的 Excel 文件,并将数据存储在名为 `df` 的 DataFrame 中。

接下来,使用 `map()` 函数对 `产品名称` 列进行映射操作,将代码替换为对应的中文名称。如果 `map()` 函数无法找到对应的映射值,我们使用 `fillna()` 函数保持原样不变。

最后,使用 `to_excel()` 函数将修改后的数据保存为 Excel 文件。

希望这次能够解决你的问题!如有任何疑问,请随时提出。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 18:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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