Назначение категорий фрейму данных

#python #pandas

Вопрос:

Ввод:

 df = {'A': ['aa','b',2,3,4,"bb",5,6,7,8],'B': ['aa',5,6,7,8,"bb",1,2,3,4]}

df = pd.DataFrame(df)
 
     A   B   
0   aa  aa  
1   b   5   
2   2   6   
3   3   7   
4   4   8   
5   bb  bb  
6   5   1   
7   6   2   
8   7   3   
 

У меня есть фрейм данных(df), мне нужно назначить столбец категории на основе столбцов [«A», «B»]

Ожидаемый Результат:

     A   B       Cat
0   aa  aa      
1   b   5       aa
2   2   6       aa
3   3   7       aa
4   4   8       aa
5   bb  bb      
6   5   1       bb
7   6   2       bb
8   7   3       bb
 

Ответ №1:

Вы можете использовать маску для пустого значения в C и where / mask / ffill :

 mask = df['C'].eq('')
df['Cat'] = df['A'].where(mask).ffill().mask(mask, '')
 

nb. Я использовал только A для определения имени, так как A/B идентичны, когда C-пустая строка

выход:

     A   B   C Cat
0  aa  aa        
1   1   5   2  aa
2   2   6   3  aa
3   3   7   4  aa
4   4   8   5  aa
5  bb  bb        
6   5   1   7  bb
7   6   2   8  bb
8   7   3   9  bb
9   8   4  10  bb
 

альтернатива без колонки C

Я проверил, что здесь тип-строка для A или B, а значение равно в a и B:

 df = pd.DataFrame({'A': ['aa','b',2,3,4,"bb",5,6,7,8],'B': ['aa',5,6,7,8,"bb",1,2,3,4]})

mask = df['A'].eq(df['B']) amp; (df['A'].str.isnumeric().eq(False) | df['B'].str.isnumeric().eq(False))
df['Cat'] = df['A'].where(mask).ffill().mask(mask, '')
 

выход:

     A   B Cat
0  aa  aa    
1   b   5  aa
2   2   6  aa
3   3   7  aa
4   4   8  aa
5  bb  bb    
6   5   1  bb
7   6   2  bb
8   7   3  bb
9   8   4  bb
 

Комментарии:

1. можете ли вы поделиться каким-либо методом без столбца «C», рассматривая только » A » и «B»

2. @JagadeeshkumarViswanathan просто замените первую строку на: mask = df['A'].map(type).eq(str)

3. иногда он может содержать строку между

4. @JagadeeshkumarViswanathan это простая вариация, как упоминал Андреас