#pandas #dataframe #indexing
#pandas #фрейм данных #индексирование
Вопрос:
У меня есть фрейм данных, в котором некоторые строки бесполезны, за исключением одной переменной. Я хочу добавить эту переменную в этих строках в предыдущую строку, а затем удалить бесполезные строки.
Во фрейме данных есть несколько строк, в которых единственная полезная информация относится к переменной, поэтому я хочу сохранить эту информацию. Точнее, мой фрейм данных выглядит примерно так
|cat1| cat2|var1|var2|
|A |x |1 |2 |
|A |x |1 |0 |
|A |x |. |5 |
|A |y |1 |2 |
|A |y |1 |2 |
|A |y |1 |3 |
|A |y |. |6 |
|B |x |1 |2 |
|B |x |1 |4 |
|B |x |1 |2 |
|B |x |1 |1 |
|B |x |. |3 |
и я хочу получить
|cat1| cat2|var1|var2|
|A |x |1 |2 |
|A |x |1 |5(5 0)|
|A |y |1 |2 |
|A |y |1 |2 |
|A |y |1 |9(6 3)|
|B |x |1 |2 |
|B |x |1 |4 |
|B |x |1 |2 |
|B |x |1 |4(3 1)|
Я пробовал код, подобный
test = df[df['var1'] == '.'].index
for num in test:
df['var2][num - 1] = df['var2][num - 1] df['var2][num]
но это не работает.
Любая помощь будет оценена.
Комментарии:
1. Правда ли, что никогда не бывает 2 последовательных
.
s?2. Нет, никогда не бывает двух последовательных ‘.’
Ответ №1:
Для очень удобочитаемого решения объедините np.where
, чтобы выбрать строки, в которых shift
var1
содержатся отредактированные строки .
. Используйте -1
для выбора следующей строки. Если это так, добавьте следующую строку, в противном случае просто заполните исходную строку. После этого просто удалите все строки с помощью .
df['var2_new'] = np.where(df['var1'].shift(-1) == '.',
df['var2'] df['var2'].shift(-1), df['var2'])
df[df['var1'] != '.']
# cat1 cat2 var1 var2 var2_new
#0 A x 1 2 2.0
#1 A x 1 0 5.0
#3 A y 1 2 2.0
#4 A y 1 2 2.0
#5 A y 1 3 9.0
#7 B x 1 2 2.0
#8 B x 1 4 4.0
#9 B x 1 2 2.0
#10 B x 1 1 4.0
Комментарии:
1. Это решило мою проблему и действительно очень удобно для чтения. Большое вам спасибо!
2. Pandas также поддерживает
df.where
команду, аналогичную numpy. Почему бы вам не использовать pandasdf.where
вместо numpy? Есть ли какое-либо преимущество в использовании numpynp.where
по сравнению с pandasdf.where
?