我有一个如下所示的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
答案 0 :(得分:3)
我认为您想set_index
和unstack
:
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')