Как использовать Pandas, чтобы заполнить некоторые ячейки определенным правилом? - PullRequest
3 голосов
/ 07 марта 2020

Это пример данных из реального.

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 является пустым, а другой не пуст, то мы должны заполнить «НЕ ОЧИСТИТЬ» в пустой ячейке. Нам нужно, чтобы ячейка была пустой, когда и поставщик, и поставщик PN пусты. enter image description here

Как использовать Pandas для получения ожидаемого результата, как показано на рисунке ниже? Спасибо.

В реальных данных много строк и столбцы могут быть доступны поставщику 20 и поставщику PN.20.

enter image description here

Ответы [ 2 ]

3 голосов
/ 07 марта 2020

Другим подходом было бы отключение с использованием wide_to_long кадра данных, а затем проверить, равна ли сумма notna 1, затем fillna else dont и снова развернуть, это поможет, если у вас много комбинаций поставщика и Поставщик 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) 

enter image description here

Так выглядит unpivoted_df после fillna: enter image description here

3 голосов
/ 07 марта 2020

L oop через соответствующие столбцы поставщика и используйте 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
...