【问题标题】:Need to retrieve original data shape from one hot encoding shape需要从一种热编码形状中检索原始数据形状
【发布时间】:2022-06-24 19:39:09
【问题描述】:

我收到了一个数据集,其中包含以前转换为热编码的列。我想检索它的旧形状来做一些预处理和填充 NAs 方法,当然还要读取数据集的统计模型。

我得到的数据列:

team2_offensive_derived_var_0 team2_offensive_derived_var_1 team2_offensive_derived_var_2 team2_offensive_derived_var_3 team2_offensive_derived_var_4 team2_offensive_derived_var_5 team2_offensive_derived_var_6 team2_offensive_derived_var_7 team2_offensive_derived_var_8 team2_offensive_derived_var_9 team2_offensive_derived_var_10
0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0

我想把它的形状变成

row_id team2_offensive_derived
0 var 10
1 var 9
2 var 8
3 var 7
4 var 6
5 var 5
6 var 4
7 var 3
8 var 2
9 var 1
10 var 0

我也有这样的列:

team2_other_ratio_var_42 team2_other_ratio_var_43 team2_other_ratio_var_44 team2_other_ratio_var_45 team2_other_ratio_var_46 team2_other_ratio_var_47 team2_other_ratio_var_48 team2_other_ratio_var_49 team2_other_ratio_var_50 team2_other_ratio_var_51 team2_other_ratio_var_52
0.0 0.400 0.200 0.000 0.750 0.250 0.341121 0.375 0.354167 0.184211 0.000

但我很困惑我应该如何将它恢复到原来的形状? \"分类\" 但我不知道怎么做?

谢谢大家的帮助

  • But I\'m confused how should I retrieve it to it\'s original shape? \"Categorical\" But I don\'t know how? - 预期输出是什么?
  • 我仍在与原始形状作斗争,我不知道数据的原始形状是什么。
  • 所以有0 和浮动的一行DataFrame,获取原始形状的逻辑是什么?
  • 所以,我想我会离开这个。但我想尽量减少正确预处理数据的列数。正如我告诉过你的,我正试图弄清楚我应该怎么做。
  • 它是一行 DataFrame,需要删除数据中带有0 的列吗?

标签: python pandas dataframe statsmodels data-preprocessing


【解决方案1】:

您可以使用stack

cols = ['row_id', 'team2_offensive_derived']
out = df.replace(0, pd.NA).stack().rename_axis(cols).reset_index()[cols]

输出:

    row_id         team2_offensive_derived
0        0  team2_offensive_derived_var_10
1        1   team2_offensive_derived_var_9
2        2   team2_offensive_derived_var_8
3        3   team2_offensive_derived_var_7
4        4   team2_offensive_derived_var_6
5        5   team2_offensive_derived_var_5
6        6   team2_offensive_derived_var_4
7        7   team2_offensive_derived_var_3
8        8   team2_offensive_derived_var_2
9        9   team2_offensive_derived_var_1
10      10   team2_offensive_derived_var_0

使用不同的列名:

out = (df
       .replace(0, pd.NA)
       .rename(columns=lambda x: x.replace('team2_offensive_derived_', ''))
       .stack()
       .rename_axis(cols)
       .reset_index()[cols]
      )

输出:

    row_id team2_offensive_derived
0        0                  var_10
1        1                   var_9
2        2                   var_8
3        3                   var_7
4        4                   var_6
5        5                   var_5
6        6                   var_4
7        7                   var_3
8        8                   var_2
9        9                   var_1
10      10                   var_0

【讨论】:

    【解决方案2】:

    利用:

    #split by last previous _
    df.columns = df.columns.str.rsplit('_', 2, expand=True)
    #replace 0 to NaNs, so reshape remove rows with 0
    df = df.replace(0, np.nan).stack([1,2])
    #join MultiIndex value
    df.index = df.index.map(lambda x: f'{x[1]} {x[2]}')
    #create DataFrame
    df = df.index.to_frame(name='team2_offensive_derived',index=False)
    
    print (df)
       team2_offensive_derived
    0                   var 10
    1                    var 9
    2                    var 8
    3                    var 7
    4                    var 6
    5                    var 5
    6                    var 4
    7                    var 3
    8                    var 2
    9                    var 1
    10                   var 0
    

    【讨论】:

      猜你喜欢
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2010-12-31
      • 2023-02-07
      • 2015-03-19
      • 2020-10-26
      相关资源
      最近更新 更多