如何将列中的值翻转到列标题中?

时间:2018-08-23 15:57:58

标签: python python-3.x pandas

我有一个如下所示的df:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Playground',
      home: TestPage(),
    );
  }
}

class TestPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Calendar'),
      ),
      body: WeekView(),
    );
  }
}

const headerHeight = 50.0;
const hourHeight = 100.0;

class WeekView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return CustomScrollView(
      slivers: <Widget>[
        SliverPersistentHeader(
          delegate: WeekViewHeaderDelegate(),
          pinned: true,
        ),
        SliverToBoxAdapter(
          child: _buildGrid(),
        )
      ],
    );
  }

  Widget _buildGrid() {
    return SizedBox(
      height: hourHeight * 24,
      child: Row(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: List.generate(7, (d) => _buildColumn(d)),
      ),
    );
  }

  Widget _buildColumn(int d) {
    return Expanded(
      child: Stack(
        children: <Widget>[
          Positioned(
            left: 0.0,
            top: d * 25.0,
            right: 0.0,
            height: 50.0 * (d + 1),
            child: Container(
              margin: EdgeInsets.symmetric(horizontal: 2.0),
              color: Colors.orange[100 + d * 100],
            ),
          )
        ],
      ),
    );
  }
}

class WeekViewHeaderDelegate extends SliverPersistentHeaderDelegate {
  @override
  Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) {
    return Container(
      color: Colors.red.withOpacity(0.5),
      child: Center(
        child: Text('HEADER'),
      ),
    );
  }

  @override
  double get maxExtent => headerHeight;

  @override
  double get minExtent => headerHeight;

  @override
  bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate) {
    return false;
  }
}

每个ID的索引长度都不同,并且字段类型大致相同,但有些字段更多,有些字段更少。

如何翻转df,以使字段为列,值位于其下方?

像这样:

    Id   field          value
0   1    first_name      a
1   1    number          123
2   1    last_name       aa
0   2    first_name      b
1   2    number          456
2   2    last_name       bb
3   2    type            p

2 个答案:

答案 0 :(得分:3)

我认为您想set_indexunstack

out = df.set_index(['Id', 'field']).unstack()
out.columns = out.columns.get_level_values(1)
out.reset_index()

field  Id first_name last_name number type
0       1          a        aa    123  NaN
1       2          b        bb    456    p

答案 1 :(得分:2)

这也只是.pivot

df.pivot(index='Id', columns='field', values='value').reset_index()
#field  Id first_name last_name number type
#0       1          a        aa    123  NaN
#1       2          b        bb    456    p

如果收到ValueError,则可能意味着您在['Id', 'field']上重复了一行。这将使其起作用,但将选择该值作为在DataFrame中第一个出现的行。

pd.pivot_table(df, index='Id', columns='field', values='value', aggfunc='first')