鱼C论坛

 找回密码
 立即注册
查看: 2230|回复: 4

我想问下如何实现python的pandas操作excel中if函数的实现

[复制链接]
发表于 2020-11-26 11:15:52 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 xiaoqu525 于 2020-11-26 11:18 编辑

耗材        初估        精估        总估
木头        10        20        20   =IF(C2="",B2,C2)
石头        10                10   =IF(C3="",B3,C3)
油漆        10        10        10   =IF(C4="",B4,C4)



根据耗材,初估,精估的数据,得到总估的数据,总估的公式是=IF(C2="",B2,C2)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-26 11:18:11 | 显示全部楼层
图片看不到。
excel中的if是VBA,和pandas操作excel是两回事。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-26 11:19:16 | 显示全部楼层
suchocolate 发表于 2020-11-26 11:18
图片看不到。
excel中的if是VBA,和pandas操作excel是两回事。

我就想问下有没类似if函数的东西......不会写,尴尬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-26 11:24:09 | 显示全部楼层
本帖最后由 suchocolate 于 2020-11-26 14:21 编辑
xiaoqu525 发表于 2020-11-26 11:19
我就想问下有没类似if函数的东西......不会写,尴尬


看到文字了
这个用panda索引和赋值就行,外头用python的if即可。假如原始数据是这样: excel-1.png
import pandas as pd

if __name__ == '__main__':
    df = pd.read_excel('test.xlsx')
    # 打印一下原始值
    print(df)
    print('开始修改...')
    # df['精估'].isnull() 生成一个精估列各行是否为空的bool组成的列表 [ false, true, false]
    for n, v in enumerate(df['精估'].isnull()):
        # 如果为空,那么使用b列的值,pandas编号是1, 3是d列
        if v:
            df.iat[n, 3] = df.iat[n, 1]
        # 如果不空,那么使用c列的值,pandas编号2
        else:
            df.iat[n, 3] = df.iat[n, 2]
    print(df)
或者用openpyxl,直接在相关表格输入公式也可以实现。
from openpyxl import load_workbook


if __name__ == '__main__':
    wb = load_workbook('test.xlsx')
    ws = wb.active
    for n in range(2, 5):
        # 每行公式只是数字有变化
        fml = f'=IF(C{n}="",B{n},C{n})'
        ws[f'd{n}'] = fml
    # 另存一份,方便对比
    wb.save('test2.xlsx')

当然,pandas也可以用写入公式的方式让excel自己计算,但pandas的长处是计算数据,写的话还是用openpyxl比较合适
import pandas as pd

if __name__ == '__main__':
    df = pd.read_excel('test.xlsx')
    # 打印一下原始值
    print(df)
    print('开始修改')
    data = []
    for n in range(2, 5):
        fml = f'=IF(C{n}="",B{n},C{n})'
        data.append(fml)
    df['总估'] = data
    print(df)
    df.to_excel('test5.xlsx')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-27 13:36:36 | 显示全部楼层
应该是这个吧?
Where用来根据条件替换行或列中的值。
如果满足条件,保持原来的值,
不满足条件则替换为其他值。
默认替换为NaN,也可以指定特殊值。
用法:
DataFrame.where(cond, other=nan, inplace=False, axis=None, level=None, errors='raise', try_cast=False, raise_on_error=None)
参数作用:
• cond:布尔条件,如果 cond 为真,保持原来的值,否则替换为other
• other:替换的特殊值
• inplace:inplace为真则在原数据上操作,为False则在原数据的copy上操作
• axis:行或列
将df中列value_1里小于5的值替换为0:
df['value_1'].where(df['value_1'] > 5 , 0)
Where是一种掩码操作。
「掩码」(英语:Mask)在计算机学科及数字逻辑中指的是一串二进制数字,通过与目标数字的按位操作,达到屏蔽指定位而实现需求。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-17 07:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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