【问题标题】:Pandas Crosstab with third column带有第三列的 Pandas 交叉表
【发布时间】:2021-12-23 21:56:56
【问题描述】:

我有一个看起来像这样的 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

我正在尝试对这些数据进行交叉制表以构建一个新的数据框,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 交叉表,但似乎只能使用两个变量来返回实例数而不是值。我试过这个;

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

是否可以使用pd.crosstab 来实现这一点,或者是否有其他方法可用?

【问题讨论】:

    标签: python pandas crosstab


    【解决方案1】:

    使用DataFrame.filter 获取以P 开头的列的DataFrame,然后替换使用DataFrame.mask 以获取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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-28
      • 2019-05-18
      • 2020-11-30
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多