У меня есть 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. Как я могу это исправить?

3
Alexander Thomsen 2 Янв 2018 в 15:24

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
1
Scott Boston 2 Янв 2018 в 14:16

Вы также можете попробовать это без 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 ""

enter image description here

1
Tai 3 Янв 2018 в 01:36