Pandas разделить столбцы на несколько строк - PullRequest
0 голосов
/ 06 марта 2020

Я новичок в Python Pandas.

В настоящее время у меня есть данные Excel, часть из которых, как показано ниже. Как видите, каждая строка может иметь многие поставщики и поставщики. Мне нужно сохранить столбец P / N и Description и разбить остальные столбцы на строки.

 Supplier PN Supplier.1      Supplier PN.1          Supplier.2  \
0  GRM1555C1H101JA01D      YAGEO  CC0402JRNPO9BN101  GRM1555C1H101JA01J   
1      04025A6R8CAT2A      KEMET   C0402C689C5GACTU                 NaN   
2      04025A3R9CAT2A        NaN                NaN                 NaN   

                      Supplier PN.2  
0  Murata Electronics North America  
1                               NaN  
2                               NaN  

data

Что Я ожидаю:

![enter image description here]

        P/N                     Description            Supplier  \
0  302-462-326      CAP CER 0402 100pF 5% 50V              MURATA   
1  302-462-326      CAP CER 0402 100pF 5% 50V               YAGEO   
2  302-462-326      CAP CER 0402 100pF 5% 50V  GRM1555C1H101JA01J   
3  302-462-012  CAP CER 0402 6.8pF 0.25pF 50V     AVX Corporation   
4  302-462-012  CAP CER 0402 6.8pF 0.25pF 50V               KEMET   
5  302-462-009  CAP CER 0402 3.9pF 0.25pF 50V     AVX Corporation   

                        Supplier PN  
0                GRM1555C1H101JA01D  
1                 CC0402JRNPO9BN101  
2  Murata Electronics North America  
3                    04025A6R8CAT2A  
4                  C0402C689C5GACTU  
5                    04025A3R9CAT2A   

Как я могу использовать Python Pandas, чтобы справиться с этим? Спасибо.

1 Ответ

2 голосов
/ 06 марта 2020

Это очень похоже на pd.wide_to_long с твиком. Таким образом, вы можете попробовать этот код:

# sample data
# replaced with df=pd.read_excel(...)
df = pd.DataFrame({'P/N':[1,2,3],
                  'Description':['a','b','c'],
                  'Supplier':['x','y','z'],
                  'Supplier PN':['xx','yy','zz'],
                  'Supplier.1':['X','Y',np.nan],
                  'Supplier PN.1':['XX','YY',np.nan]})

(df.melt(['P/N','Description'])
   .dropna()
   .assign(stub=lambda x: x.variable.str.extract('([^\.]*)\.?'),
           idx=lambda x: x.groupby('stub').cumcount()
           )
   .pivot_table(index=['P/N','Description','idx'], 
                columns='stub', 
                values='value',
                aggfunc='first')
   .reset_index()
   .drop('idx', axis=1)
)

Или этот код с wide_to_long:

df.columns = np.where(df.columns.str.match('^Supp.*\D+$'),
                      df.columns + '.0',
                      df.columns)

(pd.wide_to_long(df, ['Supplier', 'Supplier PN'],
               ['P/N', 'Description'], 
                'num', sep='.')
   .dropna()
   .reset_index()
   .drop('num',axis=1)
)

Выход:

stub  P/N Description Supplier Supplier PN
0       1           a        x          xx
1       1           a        X          XX
2       2           b        y          yy
3       2           b        Y          YY
4       3           c        z          zz
...