【问题标题】:dstack with no multiple layers没有多层的dstack
【发布时间】:2018-07-19 07:55:02
【问题描述】:

我有以下数据集,其中包含一个数字结果和几个表示数字结果标签的列

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

怎么做?

谢谢!

【问题讨论】:

  • 如果工作,你能检查我的答案吗?

标签: python pandas dataframe reshape


【解决方案1】:

使用

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

【讨论】:

  • 感谢它的工作!我有一些带有 NaN 的行,但我似乎无法使用 df = df[(df.tag!=np.NaN)] 删除它们,为什么?
  • @FilippoSebastio - nans 是特殊值,检查docs,删除它们最好使用df = df.dropna(subset=['tag']) 或者如果想要过滤df[(df.tag.notnull())]
【解决方案2】:

用途:

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. reset_index - 先删除级别1,然后创建列表单索引
  4. 最后删除重复项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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多