Как заполнить столбец значениями, основанными на значениях другого столбца в Python?

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть фрейм данных, который выглядит следующим образом:

col1 col2 col3
1. запись
att1
att2 значение1 значение2
2. запись
att3 значение1 значение2
3. запись
att4 значение1
att5 значение1 значение2

Желаемый результат будет:

col1 col2 col3 col4
1. запись 1. запись
att1 1. запись
att2 значение1 значение2 1. запись
2. запись 2. запись
att3 значение1 значение2 2. запись
3. запись 3. запись
att4 значение1 3. запись
att5 значение1 значение2 3. запись

Проблема в том, что он не может быть жестко запрограммирован, потому что я не знаю, сколько записей и атрибутов будет там заранее. Важным дополнением является то, что записи и атрибуты являются строками.

Любая помощь будет оценена.

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

1. Что вы уже пробовали?

2. Я пробовал цикл for с операторами str.contains() if-else, но это не сработало очень хорошо.

Ответ №1:

Я думаю, что здесь важное условие — например, здесь используется df['col1'].str.contains('^d') для замены col1 значений, начиная с числа, а затем пересылки заполнения пропущенных значений на ffill :

 df['col4'] = df['col1'].where(df['col1'].str.contains('^d')).ffill()
print (df)
        col1    col2    col3       col4
0  1. record                  1. record
1       att1                  1. record
2       att2  value1  value2  1. record
3  2. record                  2. record
4       att3  value1  value2  2. record
5  3. record                  3. record
6       att4  value1          3. record
7       att5  value1  value2  3. record
 

Или тест record :

 df['col4'] = df['col1'].where(df['col1'].str.contains('record')).ffill()
 

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

1. Спасибо за быстрый ответ! Мне только что пришел в голову вопрос: что, если какой-либо атрибут начинается с числа также в col1 ?

2. @trefa — Хммм, тогда это не удалось. Я думаю, что условие зависит от данных, поэтому добавляется к возможным маскам, но в случае сбоя необходимо указать, как можно отличить значения для групп от других значений val?

3. @anik jha — Из измененных данных невозможно сопоставление по пустым строкам в обоих col2, col3 , потому что это не удалось для первой группы.

4. @ jezrael Спасибо, «запись» ответила на мой вопрос, я только что изменил регулярное выражение для ^[1-9][0-9]?.|record$