如何从pandas数据帧中反转虚拟变量

时间:2017-12-07 11:53:45

标签: python pandas dataframe

我想用虚拟变量反转数据帧。例如,

来自df_input:

Course_01 Course_02 Course_03 
  0           0         1 
  1           0         0 
  0           1         0 

到df_output

   Course
0 03
1 01
2 02

我一直在研究Reconstruct a categorical variable from dummies in pandas提供的解决方案,但它没有用。请,任何帮助将不胜感激。

非常感谢, 最好的祝福, 卡罗

4 个答案:

答案 0 :(得分:4)

我们可以使用wide_to_long,然后选择不等于零的行,即

ndf = pd.wide_to_long(df, stubnames='T_', i='id',j='T')

      T_
id  T     
id1 30   0
id2 30   1
id1 40   1
id2 40   0

not_dummy = ndf[ndf['T_'].ne(0)].reset_index().drop('T_',1)

   id   T
0  id2  30
1  id1  40

根据您的修改进行更新:

ndf = pd.wide_to_long(df.reset_index(), stubnames='T_',i='index',j='T')

not_dummy = ndf[ndf['T_'].ne(0)].reset_index(level='T').drop('T_',1)

        T
index    
1      30
0      40

答案 1 :(得分:3)

您可以使用:

#create id to index if necessary
df = df.set_index('id')
#create MultiIndex
df.columns = df.columns.str.split('_', expand=True)
#reshape by stack and remove 0 rows
df = df.stack().reset_index().query('T != 0').drop('T',1).rename(columns={'level_1':'T'})
print (df)
    id   T
1  id1  40
2  id2  30

编辑:

col_name = 'Course' 
df.columns = df.columns.str.split('_', expand=True)
df = (df.replace(0, np.nan)
        .stack()
        .reset_index()

        .drop([col_name, 'level_0'],1)
        .rename(columns={'level_1':col_name})
)
print (df)
  Course
0     03
1     01
2     02

答案 2 :(得分:2)

假设您有以下虚拟DF:

 for (Pair<Classification, Interval> combo : listOfPairs) {
   if (combo.getInterval().contains(value)) {
     return combo.getClassification(); // yeeha found one
   }
 }
 return "nothing found" ... or throw some kind of exception

我们可以准备以下帮手系列:

In [152]: d
Out[152]:
    id  T_30  T_40  T_50
0  id1     0     1     1
1  id2     1     0     1

现在我们可以将它们相乘,叠加并过滤:

    In [153]: v = pd.Series(d.columns.drop('id').str.replace(r'\D','').astype(int), index=d.columns.drop('id'))

In [155]: v
Out[155]:
T_30    30
T_40    40
T_50    50
dtype: int64

答案 3 :(得分:0)

我认为 melt() 几乎就是为此而生的?

我认为您的数据:

df_input = pd.DataFrame.from_dict({'Course_01':[0,1,0],
                               'Course_02':[0,0,1],
                               'Course_03':[1,0,0]})

更改名称以匹配您想要的输出:

df_input.columns = df_input.columns.str.replace('Course_','')

融化数据框:

dataMelted = pd.melt(df_input,  
                    var_name='Course', 
                    ignore_index=False)

清除零等:

df_output = (dataMelted[dataMelted['value'] != 0]
            .drop('value', axis=1)
            .sort_index())

>>> df_output
  Course
0     03
1     01
2     02