У меня есть 2 разных pd.DataFrames
:
dailyRtn
date A B C
2017-12-25 0.069392 0.124916 0.119108
2017-12-26 0.020000 0.100000 0.080000
2017-12-27 1.000000 1.200000 1.500000
averageofP
date A B C
2017-12-25 0.059392 0.894916 0.419108
2017-12-26 0.021000 0.100000 0.990000
2017-12-27 1.500000 1.100000 1.800000
Что можно воспроизвести с помощью кода ниже:
dailyRtn = pd.DataFrame([["2017-12-25", 0.069392, 0.124916, 0.119108],
["2017-12-26", 0.020000, 0.100000, 0.080000],
["2017-12-27", 1.000000, 1.200000, 1.500000]],
columns = ["date", "A", "B", "C"])
averageofP = pd.DataFrame([["2017-12-25", 0.059392, 0.894916, 0.419108],
["2017-12-26", 0.021000, 0.100000, 0.990000],
["2017-12-27", 1.500000, 1.100000, 1.800000]],
columns = ["date", "A", "B", "C"])
Я пытаюсь выполнить условный расчет, используя 2 df выше:
downsideDev = np.where(dailyRtn < averageofP, dailyRtn, "")
Моя цель - создать новый DataFrame (downsideDev)
, похожий на приведенные выше таблицы, но со значениями, которые взяты из моего условного аргумента с np.where
. Я знаю, что np.where
создает ndarray
, поэтому я сделал:
downsideDev = pd.DataFrame(downsideDev)
Однако, когда я смотрю на downsideDev, мои бывшие столбцы: A, B, C и т. Д. И даты: 2017-12-27 и т. Д. Исчезли и представляют собой простые целые числа + это больше не DataFrame. Как я могу это исправить?
2 ответа
IIUC, вы можете использовать set_index
, а затем включить index
и columns
в свой конструктор фрейма данных.
dailyRtn = dailyRtn.set_index('date')
averageofP = averageofP.set_index('date')
downsideDev = np.where(dailyRtn < averageofP, dailyRtn, "")
downsideDev_df = (pd.DataFrame(downsideDev, index=dailyRtn.index, columns=dailyRtn.columns)
.reset_index())
print(downsideDev_df)
Выход:
date A B C
0 2017-12-25 0.12491600000000001 0.11910799999999999
1 2017-12-26 0.02 0.08
2 2017-12-27 1.0 1.5
Вы также можете попробовать это без np.where
, в котором не будет нужной информации. Подход встроен в pandas: условный выбор плюс fillna
.
dailyRtn = pd.DataFrame([["2017-12-25", 0.069392, 0.124916, 0.119100],
["2017-12-26", 0.020000, 0.100000, 0.080000],
["2017-12-27", 1.000000, 1.200000, 1.500000]],
columns = ["date", "A", "B", "C"])
averageofP = pd.DataFrame([["2017-12-25", 0.059392, 0.894916, 0.419108],
["2017-12-26", 0.021000, 0.100000, 0.990000],
["2017-12-27", 1.500000, 1.100000, 1.800000]],
columns = ["date", "A", "B", "C"])
# select value in dailyRtn with a condition
downsideDev = dailyRtn[dailyRtn < averageofP]
downsideDev.fillna("", inplace=True) # fill out nan part with ""
downsideDev["date"] = dailyRtn["date"] # add back "date" that were replaced to ""
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.