鱼C论坛

 找回密码
 立即注册
查看: 2670|回复: 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)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-11-26 11:18:11 | 显示全部楼层
图片看不到。
excel中的if是VBA,和pandas操作excel是两回事。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我就想问下有没类似if函数的东西......不会写,尴尬
小甲鱼最新课程 -> https://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
  1. import pandas as pd

  2. if __name__ == '__main__':
  3.     df = pd.read_excel('test.xlsx')
  4.     # 打印一下原始值
  5.     print(df)
  6.     print('开始修改...')
  7.     # df['精估'].isnull() 生成一个精估列各行是否为空的bool组成的列表 [ false, true, false]
  8.     for n, v in enumerate(df['精估'].isnull()):
  9.         # 如果为空,那么使用b列的值,pandas编号是1, 3是d列
  10.         if v:
  11.             df.iat[n, 3] = df.iat[n, 1]
  12.         # 如果不空,那么使用c列的值,pandas编号2
  13.         else:
  14.             df.iat[n, 3] = df.iat[n, 2]
  15.     print(df)
复制代码

或者用openpyxl,直接在相关表格输入公式也可以实现。
  1. from openpyxl import load_workbook


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


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

  2. if __name__ == '__main__':
  3.     df = pd.read_excel('test.xlsx')
  4.     # 打印一下原始值
  5.     print(df)
  6.     print('开始修改')
  7.     data = []
  8.     for n in range(2, 5):
  9.         fml = f'=IF(C{n}="",B{n},C{n})'
  10.         data.append(fml)
  11.     df['总估'] = data
  12.     print(df)
  13.     df.to_excel('test5.xlsx')
复制代码
小甲鱼最新课程 -> https://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)在计算机学科及数字逻辑中指的是一串二进制数字,通过与目标数字的按位操作,达到屏蔽指定位而实现需求。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-30 09:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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