V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhlenmao
V2EX  ›  程序员

有点哭笑不得,折腾了快 10 个小时了,还是没搞明白 excel 的行和列

  •  1
     
  •   zhlenmao · 224 天前 · 2857 次点击
    这是一个创建于 224 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我把 chatgpt4 和 claud 都搞晕、蒙了,当然更可能是我的问题,一直没想过这个问题,毕竟能用就行了。

    一个空白的 excel 文件,上面用行 A 、B 、C..............MA.........MR....这样标注,行用 1 、2 、3 、4.......这样标注着。点中最左上的单元格是 A1,第二列是 B1 。

    如果用 pandas 。我想计算 B 列-A 列并输出,到底该怎么代码呢?

    我看他的意思,又 gg 了下,第一行好像才是他们认为的列

    18 条回复    2024-03-27 23:02:45 +08:00
    Tumblr
        1
    Tumblr  
       224 天前
    > 如果用 pandas 。我想计算 B 列-A 列并输出,到底该怎么代码呢?

    这个是不是可以理解为两个问题?
    1. 如何把 Excel 中的数据导入到 pandas
    2. 如何对两列进行相减

    如果是在 Excel 中,很简单, = B1 - A1
    zhlenmao
        2
    zhlenmao  
    OP
       224 天前
    @Tumblr 我真是受不了我自己了。如果第一行我定义下,就是 A1=A ,B1=B ,以此类推,那么类似这样
    A B C
    1 A B C
    2 1 666 33
    3 2 33 55
    4 3 55 99
    .

    import pandas as pd

    # Excel 文件路径
    file_path = 'abc.xlsx'

    # 读取 Excel 文件
    df = pd.read_excel(file_path)
    df['Difference'] = df['C'] - df['A']

    # 输出新计算的差值列
    print(df['Difference'])

    这是可以的。第 1 行成了列标题。

    A B C
    1 2 2 2
    2 1 666 33
    3 2 33 55
    4 3 55 99

    这样再执行上面的代码就是 error 报错了。因为列标题成了 2 2 2 。问题是我想指定 A B C 这个东东来定义”列“,好做运算

    搞不明白了,头晕了脑涨了 :)
    c6h6benzene
        3
    c6h6benzene  
       224 天前 via iPhone
    ABC 是列,123 是行。虽然 df 没怎么写过,但好像有.row .col 指定行列(坐标)取数的写法。
    Maxhimax
        4
    Maxhimax  
       224 天前 via iPhone   ❤️ 8
    你的表述能力堪忧。
    zhlenmao
        5
    zhlenmao  
    OP
       224 天前
    def excel_column_number(column_label):
    """将 Excel 列的字母标识符转换为从 0 开始的索引"""
    column_number = 0
    for c in column_label:
    column_number = column_number * 26 + (ord(c.upper()) - ord('A')) + 1
    # 返回从 0 开始的索引
    return column_number - 1

    # 举例使用
    import pandas as pd

    # 读取 Excel 文件
    df = pd.read_excel('反查数据 (240108)_test.xlsx')

    # 假设你想获取列标识符为"C"的数据
    column_index = excel_column_number("MR")
    column_data = df.iloc[:, column_index]

    # 显示结果
    print(column_data)

    。结。
    anson264556364
        6
    anson264556364  
       224 天前
    不知有没有 excel 好用的辅助工具
    Tumblr
        7
    Tumblr  
       224 天前
    @anson264556364 #6 Power BI 😁
    sakilascott
        8
    sakilascott  
       224 天前
    多年 excel 工作者,没看懂
    tikazyq
        9
    tikazyq  
       224 天前
    问题描述不清楚,上帝来了都没辙。你的问题看上去是 read_excel 中自动将第二行识别为了表头,但你像要第一行识别为表头,可以查一下文档,有个参数应该叫 skip_rows
    anson264556364
        10
    anson264556364  
       224 天前
    @Tumblr 好像挺好,好像挺复杂
    visper
        11
    visper  
       224 天前
    你这跟 excel 没关系,是跟 pandas 加载数据的时候怎么指定列名有关系吧。
    Muniesa
        12
    Muniesa  
       224 天前 via Android
    我是 ai 我也懵,我猜你的目的大概可以通过在 read_excel 的参数里加上 header=None, names=['A', 'B','C']实现
    xyfan
        13
    xyfan  
       224 天前
    pandas 从 Excel 导入数据时默认将第一行当作列名(保存为 Excel 时也是如此),如果你不想让 pandas 将第一行识别为列名,而是将其识别为第一行数据,只需要在导入数据时指定 read_excel 的参数 header=None ,如楼上所示。令:表达能力堪忧,搜索能力也堪忧,我使用关键词“pandas excel 第一行识别为数据”进行搜索,结果中既有将第一行作为列名的教程,也有不将第一行作为列名的教程,完全能够解决你的问题。
    ZnductR0MjHvjRQ3
        14
    ZnductR0MjHvjRQ3  
       224 天前
    哥们 你为什么一定要让他明白?你绕圈问他 然后让他给一些差不多的 你去理解代码 然后改不比让他搞明白强吗
    cyspy
        15
    cyspy  
       224 天前
    直接用 row 和 column ,陆台对行列的翻译是反的
    zhlenmao
        16
    zhlenmao  
    OP
       222 天前
    哈哈哈。我来总结下:pandas 读取时,是不理会列标签 A 、B 、C ,行标签 1 、2 、3.....这些的,他只是读入了整个表。而我是天真的想着他会读进这些东西 :)
    zhlenmao
        17
    zhlenmao  
    OP
       222 天前
    @Tumblr 表格的第一行要定义 A 、B ,也就是单元格 A1=A ,单元格 A2=B ,这样相当于给 pandas 定义了标题了。原有的 excel 的标签名它是不认识的,那些我们人类看到的列标签名 A\B\C ,行的 1\2\3
    zhlenmao
        18
    zhlenmao  
    OP
       222 天前
    @Tumblr 我去,一敲击回车自动回复了。import pandas as pd

    # 假设 df 是你的 DataFrame
    # 创建一个新列 'C' 来存储 A 列和 B 列之间的差
    df = pd.read_excel('abc.xlsx', engine='openpyxl')

    df['C'] = df['B'] - df['A']
    df.to_excel('c.xlsx', index=False, engine='openpyxl')
    # 输出结果
    print(df)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3360 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 11:00 · PVG 19:00 · LAX 03:00 · JFK 06:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.