没有多层的dstack

时间:2018-07-19 07:55:02

标签: python pandas dataframe reshape

我有以下具有数字结果的数据集和几个表示数字结果标签的列

outcome  tag1   tag2    tag3
340      a      b      a
123      a      a       b
23       d      c       b
54       c      a       c

我想通过根据列值(a,b,c ..)和相对结果值创建行来拆开数据集,例如:

tag outcome
a   340
a   123
a   54
b   340
b   124
b   23
c   23
d   54

如何?

谢谢!

2 个答案:

答案 0 :(得分:0)

使用:

df1 = (df.melt('outcome', value_name='tag')
      .sort_values('tag')
      .drop('variable', axis=1)
      .dropna(subset=['tag'])
      .drop_duplicates()[['tag','outcome']])

说明

  1. melt重塑
  2. sort_values更改订单
  3. drop删除列
  4. 通过dropna删除可能的缺失值
  5. 最后drop_duplicates删除重复项

或者:

df1 = (df.set_index('outcome')
       .stack()
       .sort_values()
       .reset_index(level=1, drop=True)
       .reset_index(name='tag')
       .drop_duplicates()[['tag','outcome']])

说明

  1. set_indexstack重塑
  2. Seriessort_values
  3. 排序
  4. 双重reset_index-首先删除1级,然后创建列表单索引
  5. 最后drop_duplicates删除重复项

print (df1)
   tag  outcome
0    a      340
1    a      123
7    a       54
4    b      340
9    b      123
10   b       23
3    c       54
6    c       23
2    d       23

答案 1 :(得分:0)

使用

In [321]: (df.set_index('outcome').unstack()
             .reset_index(level=0, drop=True)
             .sort_values()
             .reset_index(name='tag')
             .drop_duplicates())
Out[321]:
    outcome tag
0       340   a
1       123   a
3        54   a
5       340   b
6       123   b
7        23   b
8        54   c
9        23   c
11       23   d