我想问下如何实现python的pandas操作excel中if函数的实现
本帖最后由 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)
图片看不到。
excel中的if是VBA,和pandas操作excel是两回事。 suchocolate 发表于 2020-11-26 11:18
图片看不到。
excel中的if是VBA,和pandas操作excel是两回事。
我就想问下有没类似if函数的东西......不会写,尴尬 本帖最后由 suchocolate 于 2020-11-26 14:21 编辑
xiaoqu525 发表于 2020-11-26 11:19
我就想问下有没类似if函数的东西......不会写,尴尬
看到文字了
这个用panda索引和赋值就行,外头用python的if即可。假如原始数据是这样: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 = df.iat
# 如果不空,那么使用c列的值,pandas编号2
else:
df.iat = df.iat
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 = 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') 应该是这个吧?
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)在计算机学科及数字逻辑中指的是一串二进制数字,通过与目标数字的按位操作,达到屏蔽指定位而实现需求。
页:
[1]