Добавление двух элементов в фрейм данных (на основе индекса)

#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. Почему бы вам не использовать pandas df.where вместо numpy? Есть ли какое-либо преимущество в использовании numpy np.where по сравнению с pandas df.where ?