【问题标题】:selecting values from a pandas dataframe based on row and column labels stored in a different dataframe根据存储在不同数据框中的行和列标签从 pandas 数据框中选择值
【发布时间】:2018-07-17 13:14:48
【问题描述】:

我有两个数据框: 第一个包含每个 ID 的评级和期限

df1 = 
ID     RATING     TENOR
1234   BBB        2.0
2345   BB+        1.5
3456   BBB-       1.0

ID 是索引列。

在第二个数据框 df2 中,我有一个评级矩阵作为索引,期限作为列名。

         0.5       1.0       1.5       2.0  
BBB+  0.000750  0.001500  0.002651  0.003800  
BBB   0.001201  0.002400  0.003751  0.005100  
BBB-  0.001401  0.002800  0.006256  0.009700  
BB+   0.002854  0.005700  0.009106  0.012500  
BB    0.004058  0.008100  0.014470  0.020800  
BB-   0.006723  0.013400  0.024108  0.034700  
B+    0.011567  0.023000  0.043005  0.062600  
B     0.033874  0.066600  0.086257  0.105500  
B-    0.048475  0.094600  0.124649  0.153700  

现在我想选择与 df1 中每个 id 的评级和期限相对应的值,并将其添加到 df1 中的新列中。 所以结果应该是这样的:

ID     RATING     TENOR   PD  
1234   BBB        2.0     0.005100      
2345   BB+        1.5     0.009106  
3456   BBB-       1.0     0.002800

我试过了
df1['PD'] = df2.loc[df1.RATING, df1.TENOR].values

但这不起作用。 感谢您的帮助。

【问题讨论】:

  • 请尝试以其他想要帮助您的人可以阅读的方式格式化问题。
  • 对不起,我是新手,所以我并没有很好地格式化,希望现在更好。

标签: python pandas dataframe


【解决方案1】:

使用lookup:

df1['PD'] = df2.lookup(df1.RATING,df1.TENOR.astype(str))

输出:

     RATING  TENOR        PD
ID                          
1234    BBB    2.0  0.005100
2345    BB+    1.5  0.009106
3456   BBB-    1.0  0.002800

注意:我必须使用 astype,因为我的 dtypes 在我的 df2.columns 和 df1.TENOR 中不匹配。您必须检查这一点,根据您的数据类型,您可能不需要 astype。

【讨论】:

  • 非常感谢,这正是我想要的。它工作得很好!
猜你喜欢
  • 2021-07-23
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多