Есть ли способ добавить значение из определенного столбца в предыдущую строку?

#python #pandas

Вопрос:

Есть ли возможность перебрать фрейм данных, извлечь значение из одного столбца и добавить его в предыдущую строку? После этого удалите эту строку, так как в противном случае она не содержит никакой информации.

Оригинал

Указатель A B C D
1 текст текст текст текст
2 NaN NaN Ценность NaN
3 текст текст текст текст
4 NaN NaN Ценность NaN

Выход

Указатель A B C D
1 строка строка строка, Значение строка
3 строка строка строка, Значение строка

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

Первый шаг

Выберите строки, где, например, столбец А содержит значения nan.

 df[df['A'].isnull()]
 

Промежуточный этап

Добавьте значение в C к тексту в строке до (например, 2C -> 1C)

 ?
 

Последний шаг

Отбросьте строки, где, например, столбец А содержит значения nan.

 df.dropna(subset=['A'])
 

Ответ №1:

Я исправил ваш исходный фрейм данных, добавив одну строку:

          A    B     C    D
Index                     
1       T1   T2    T3   T4
2      NaN  NaN  Val1  NaN
3       T5   T6    T7   T8
4      NaN  NaN  Val2  NaN
5      T10  T11   T12  T13
 

Первый шаг-вычислить ряд, указав, какие строки следует изменить.

 myRows = df.A.shift(-1).isnull() amp; df.C.shift(-1).notnull()
 

Я предположил, что:

  • Столбец в следующей строке должен быть NaN,
  • и столбец C в следующей строке не должен быть NaN.

Вторым шагом является вычисление новых значений для вышеуказанных («разыскиваемых») строк:

 newVals = (df.C   ', '   df.C.shift(-1))[myRows]
 

Следующий шаг-записать их в df.C с помощью маски, чтобы сохранить другие значения:

 df.C.mask(myRows, newVals, inplace=True)
 

И последний шаг-удалить строки, содержащие NaN, в столбце:

 df.dropna(subset=['A'], inplace=True)
 

Конечный результат таков:

          A    B         C    D
Index                         
1       T1   T2  T3, Val1   T4
3       T5   T6  T7, Val2   T8
5      T10  T11       T12  T13