Pandas 与第三列的交叉表

Pandas Crosstab with third column

我有一个看起来像这样的 Dataframe df,尽管我有 20 多个 P(n) 列;

Time    Speed    P1     P2    Ratio
1       100      2      NaN     1.2
2       150      3      NaN     1.3
3       500      4      NaN     1.4
4       500      5      NaN     1.5
5       900      NaN      7     1.6
6       150      NaN      6     1.7
7       100      NaN      8     1.8

我正在尝试对这些数据进行交叉制表以构建一个新的 Dataframe,Ratio 值对应 SpeedP(n) 的每个值。这样结果看起来像这样;

Time    Speed    P1       P2    
1       100      1.2      NaN
2       150      1.3      NaN
3       500      1.4      NaN
4       500      1.5      NaN
5       900      NaN      1.6
6       150      NaN      1.7
7       100      NaN      1.8

基本上,我的目标是将 P(n) 的值替换为 Ratio 的值。

这似乎是一项简单的任务,但我却被困在这里。我曾尝试使用 pandas 交叉表,但似乎只能利用两个变量来 return 实例数而不是值。我试过了;

new_df = pd.crosstab(df['Speed'], df['Ratio'].fillna('n/a'))

是否可以使用 pd.crosstab 来实现此目的或是否有其他方法可用?

使用DataFrame.filter for get DataFrame with columsn starting by P and then for replace use DataFrame.mask for not missing values tested by DataFrame.notna:

df1 = df.filter(regex='^P')
df[df1.columns] = df1.mask(df1.notna(), df['Ratio'], axis=0)

print (df)
   Time  Speed   P1   P2  Ratio
0     1    100  1.2  NaN    1.2
1     2    150  1.3  NaN    1.3
2     3    500  1.4  NaN    1.4
3     4    500  1.5  NaN    1.5
4     5    900  NaN  1.6    1.6
5     6    150  NaN  1.7    1.7
6     7    100  NaN  1.8    1.8