如何使用 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]
                  )

SupplierSupplier PN 在列中成对出现。要求是,如果 Suppliersupplier 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_dffillna 之后的样子:

【讨论】:

以上是关于如何使用 Pandas 用定义的规则填充一些单元格?的主要内容,如果未能解决你的问题,请参考以下文章

excel表用函数填充颜色的方法

Pandas读取excel合并单元格的正确姿势(openpyxl合并单元格拆分并填充内容)

excel 在下拉时,如何使单元格背景色不变?

如何在python pandas中用0填充空单元格[重复]

excel第一个单元格选择不同的下拉内容后,后面的单元格会填充颜色

excel如何设置输入数字后单元格自动填充颜色