#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$