首页 > 解决方案 > 如何使用 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。

在此处输入图像描述

标签: pythonpandasmultiple-columnsfillna

解决方案


遍历相关的供应商列并使用 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

推荐阅读