#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 это простая вариация, как упоминал Андреас