如何使用 Pandas 用定义的规则填充一些单元格?
Posted
技术标签:
【中文标题】如何使用 Pandas 用定义的规则填充一些单元格?【英文标题】:How to use Pandas to fill some cells with a defined rule? 【发布时间】:2020-06-19 18:53:33 【问题描述】:这是来自真实的示例数据。
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]
)
Supplier 和 Supplier PN 在列中成对出现。要求是,如果 Supplier 和 supplier PN 之一为空,但另一个不为空,则必须在空单元格中填写“NOT CLEAR”。 当供应商和供应商 PN 都为空时,我们需要保持单元格为空。
如何使用 Pandas 获得如图所示的预期结果 下面?谢谢。
真实数据有很多行和列,可以到达Supplier.20 和供应商 PN.20。
【问题讨论】:
【参考方案1】:遍历相关的供应商列并使用 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
【讨论】:
谢谢。但实际上有很多列,很多供应商和供应商 PN。有什么方法可以处理整体而不是每列? @Ringo 如果这个带有循环的新编辑代码是您正在寻找的理想解决方案,请标记为答案。【参考方案2】:另一种方法是使用 wide_to_long
数据框进行反透视,然后检查 notna 的总和是否为 1 然后 fillna 否则不要,然后再次返回,如果您有许多供应商和供应商 PN 的组合,这将有所帮助。
unpivotted_df = (pd.wide_to_long(df,['Supplier','Supplier PN'],
['P/N','Description'],'idx',sep='.'))
cond = unpivotted_df.notna().sum(1).eq(1)
unpivotted_df[:]=np.where(cond[:,None],unpivotted_df.fillna('NOT CLEAR'),unpivotted_df)
out = unpivotted_df.unstack().sort_index(level=1,axis=1).reindex(df[['P/N','Description']])
out.columns=out.columns.map('0[0].0[1]'.format)
这是unpivoted_df
在fillna
之后的样子:
【讨论】:
以上是关于如何使用 Pandas 用定义的规则填充一些单元格?的主要内容,如果未能解决你的问题,请参考以下文章
Pandas读取excel合并单元格的正确姿势(openpyxl合并单元格拆分并填充内容)