PANDAS: выполнить вычисление для элемента фрейма данных pandas на основе значения bool в отдельном фрейме данных

#python #pandas #numpy #dataframe

#python #pandas #numpy #фрейм данных

Вопрос:

У меня есть 3 фрейма данных, все они имеют одинаковую длину индекса, но имеют разное количество столбцов. Это их выходные данные

 df1: 
             HPMI  LQPN  VHJ  AEBV  WOY
2008-08-31     0     0    0     0    0
2008-09-30     0     0    0     0    0
2008-10-31     0     1    0     1    1
2008-11-30     1     1    1     0    0

df2: 
             HPMI  LQPN  VHJ  AEBV  WOY
2008-08-31     0     0    0     0    0
2008-09-30     0     0    0     0    0
2008-10-31     1     0    1     1    0
2008-11-30     0     1    0     1    1

df3:
                   HPMI        LQPN         VHJ        AEBV         WOY
2008-08-31  3.13172138  0.72709204  5.76874778  1.77557845  0.04098317
2008-09-30 -3.78816218 -0.67583590 -4.95433863 -1.67093250 -0.24929051
2008-10-31  0.05579709  0.29199789  0.00697116  1.05956179  0.30686995
2008-11-30  1.25459098  6.87369275  2.58265839  6.92676837  0.84632677
  

Я хотел бы выполнить вычисление, например, в df2, если HPMI == 1 на дату 2008-10-31, тогда я хотел бы выполнить вычисление с тем же именем столбца и значением индекса df3, в противном случае, если HPMI == 0, тогда сделайте df3 == 0.

Это то, что у меня есть до сих пор, и это работает, но не работает с фреймами данных, которые имеют разное количество столбцов или строк.

Я не уверен, правильно ли я формулирую вопрос, поэтому, пожалуйста, дайте мне знать, если что-то неясно, и любая помощь будет оценена

 def portfolio_returns(df1, df2, df3, n_stocks):
    
    weight = 1 / n_stocks 

    output_short = np.where(df1 == 1, (df3 * weight)* -1, 0)
    output_long = np.where(df2 == 1, df3 * weight, 0)
   
    output = output_short   output_long
    
    expected_returns = pd.DataFrame(output, columns=lookahead_returns.columns, index=lookahead_returns.index)
    
    return expected_returns
  

Ответ №1:

Если требуется одинаковое количество и порядок во всех 3 фреймах данных, которые используются Index.union с DataFrame.reindex , здесь задается 0 для несуществующих столбцов параметром fill_value=0 :

 def portfolio_returns(df1, df2, df3, n_stocks):
    
    cols = df1.columns.union(df2.columns).union(df3.columns)
    df1 = df1.reindex(cols, axis=1, fill_value=0)
    df2 = df2.reindex(cols, axis=1, fill_value=0)
    df3 = df3.reindex(cols, axis=1, fill_value=0)
        
    weight = 1 / n_stocks 

    output_short = np.where(df1 == 1, (df3 * weight)* -1, 0)
    output_long = np.where(df2 == 1, df3 * weight, 0)
   
    output = output_short   output_long
    
    expected_returns = pd.DataFrame(output, columns=cols, index=lookahead_returns.index)
    
    return expected_returns