python - 如何使用 Pandas 用定义的规则填充一些单元格?
问题描述
这是来自真实的样本数据。
df = pd.DataFrame({'P/N':['302-462-326','302-462-012','302-462-009'],
'Description':['CAP CER 0402 100pF 5% 50V','CAP CER 0402 6.8pF 0.25pF 50V','CAP CER 0402 3.9pF 0.25pF 50V'],
'Supplier.0':['MURATA','AVX Corporation','AVX Corporation'],
'Supplier PN.0':['GRM1555C1H101JA01D',np.nan,'04025A3R9CAT2A'],
'Supplier.1':[np.nan,'KEMET',np.nan],
'Supplier PN.1':['CC0402JRNPO9BN101','C0402C689C5GACTU',np.nan],
'Supplier.2':['Murata Electronics North America',np.nan,np.nan],
'Supplier PN.2':['GRM1555C1H101JA01J',np.nan,np.nan]
})
供应商和供应商 PN在列中成对出现。要求是,如果供应商和供应商 PN之一为空,但另一个不为空,则我们必须在空单元格中填写“NOT CLEAR”。当供应商和供应商 PN 都为空时,我们需要保持单元格为空。
如何使用 Pandas 获得如下图所示的预期结果?谢谢。
真实数据有很多行和列,可以到达Supplier.20和Supplier PN.20。
解决方案
遍历相关的供应商列并使用 np.where 和 .isna() / .notna()
import pandas as pd
import numpy as np
df = pd.DataFrame({'P/N':['302-462-326','302-462-012','302-462-009'],
'Description':['CAP CER 0402 100pF 5% 50V',
'CAP CER 0402 6.8pF 0.25pF 50V',
'CAP CER 0402 3.9pF 0.25pF 50V'],
'Supplier.0':['MURATA','AVX Corporation','AVX Corporation'],
'Supplier PN.0':['GRM1555C1H101JA01D',np.nan,'04025A3R9CAT2A'],
'Supplier.1':[np.nan,'KEMET',np.nan],
'Supplier PN.1':['CC0402JRNPO9BN101','C0402C689C5GACTU',np.nan],
'Supplier.2':['Murata Electronics North America',np.nan,np.nan],
'Supplier PN.2':['GRM1555C1H101JA01J',np.nan,np.nan]
})
cols = df.columns
i, j = 0, 0
for col in cols:
if 'Supplier.' in col:
col_var1 = f'Supplier.{i}'
col_var2 = f'Supplier PN.{i}'
df[col_var1] = np.where(df[col_var1].isna() & df[col_var2].notna(),
'NOT CLEAR',
df[col_var1])
i += 1
elif 'Supplier PN.' in col:
col_var1 = f'Supplier.{j}'
col_var2 = f'Supplier PN.{j}'
df[col_var2] = np.where(df[col_var2].isna() & df[col_var1].notna(),
'NOT CLEAR',
df[col_var2])
j += 1
df
推荐阅读
- ruby-on-rails - Ruby 如何使用 ActiveRecord 连接结果?
- lua - lua 脚本,当通过 wrk 执行时,版本不同
- java - 程序类型已经存在:retrofit2.Converter$Factory Retrofit 编译错误
- json - 在 Go 语言中使用深度嵌套的 JSON
- unity3d - 制作 NavMeshAgents 以避免某些代理
- c++ - 自定义 QLineEdit
- azure - Azure 上的物理 CPU 和超线程有什么区别?
- javascript - 使用 axios 删除请求 - React
- javascript - 如何通过在 webpack 4 中设置 eslint 来解决导入/未解决问题
- ansible - 在 Ansible 中生成证书链