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