панды собирают значение для заполнения новых столбцов

#python #pandas

#python #pandas

Вопрос:

Я пытаюсь получить новые столбцы B и C с условием, что значение B будет положительным, если «A» за один день больше, чем «A» за день до этого. В противном случае значение будет отрицательным (столбец C).

Вот пример того, что я пытаюсь получить:

     A         B         C
0.  167765   
1.  235353    235353
2.   89260     89260
3.  188382    188382
4.  104677              104677
5.  207723              207723
  

Я замечаю, что это приведет к ошибке индекса, потому что количество данных в столбцах B и C будет отличаться от исходного столбца A.

В настоящее время я использую это для тестирования перемещения определенных данных в столбец B, и это приводит к тому, что длина значений не соответствует длине ошибки индекса:

 df['B'] = np.where(df['A'] <= 250000)
  

как мне получить желаемый результат, если первая строка является NA или пустой?

желаемый результат:

     B          C
0.     
1.  235353
2.   89260
3.  188382
4.             104677
5.             207723
  

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

1. И для C, какие данные вы хотите переместить? Кажется, они тоже меньше 250000

2. Привет, спасибо за ваш комментарий. Для C я хочу переместить только 104677 и 207723. Да, это так, но я не уверен, как это сделать

3. Привет, можете ли вы указать, что вы вводите?

4. Привет @EliranAbdoo, не могли бы вы уточнить, когда спрашиваете мой вклад? Я не совсем уверен, что вы подразумеваете под моим вводом.

5. Неясно, представляет ли первый сегмент кода в вашем вопросе ваш входной фрейм данных, поскольку вы говорите «пример того, что я пытаюсь получить».

Ответ №1:

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

В моем понимании значение должно быть помещено в столбец B, если оно больше, чем значение накануне. В противном случае в столбце C.

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

Хитрость заключается в использовании .where объекта pandas Series , который автоматически вставляет NaN s.

 df = pd.DataFrame({'A': [167765, 235353, 89260, 188382, 104677, 207723]})

diffs = df['A'].diff()

df['B'] = df['A'].where(diffs >= 0)
df['C'] = df['A'].where(diffs < 0)
  

diffs будет следующее, Series которое также поставляется с удобным NaN в первой строке.

 0         NaN
1     67588.0
2   -146093.0
3     99122.0
4    -83705.0
5    103046.0
Name: A, dtype: float64
  

Сравнение с NaN всегда возвращает False . Поэтому мы можем опустить первую строку, сравнивая положительные и отрицательные значения отдельно.

Результирующая таблица выглядит следующим образом

         A         B         C
0  167765       NaN       NaN
1  235353  235353.0       NaN
2   89260       NaN   89260.0
3  188382  188382.0       NaN
4  104677       NaN  104677.0
5  207723  207723.0       NaN
  

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

1. Привет, ваш ответ наполовину соответствует действительности, НО ваш подход дал мне представление о том, как решить мои проблемы. Итак, спасибо за ваше время.

Ответ №2:

Вы можете попробовать предоставить явный список индексов:

 df['B'] = np.where(df.index.isin([1, 2, 3]), df['A'], np.nan)
df['C'] = np.where(df.index.isin([4, 5]), df['A'], np.nan)