在遵循特定结构的同时按列对多索引进行排序

时间:2019-04-03 21:40:48

标签: python pandas numpy sorting multi-index

我正在使用熊猫根据列(“ D”)中的整数对n级数组进行排序。非常重要的是,组的继承关系必须保持在仅第一级和第三级的基础上。

我尝试遵循this solution进行排序,其中排序基于索引A和B。但是,我想要根据索引A和C进行排序,如所需输出所述。我尝试使用numpy.lexsort()来实现此目的,但是提供的链接中的答案并不能说明功能的工作原理,因此我仍然很困惑。

a = np.lexsort([results.tx.values,
                results.groupby(level=[0,1]).tx.transform('sum').values, 
                results.groupby(level=0).tx.transform('sum').values])

这将根据示例链接中的第一个和第二个索引进行排序

示例输入:

                    D
A     B     C
Gran1 Par1  Child1  3
            Child2  7
            Child3  2
      Par2  Child1  9
            Child2  2
      Par3  Child1  6
Gran2 Par1  Child1  3
      Par2  Child1  6
            Child2  2
            Child3  3
      Par3  Child1  6
            Child2  8

我得到的输出:

                        D
    A     B     C
    Gran2 Par3  Child2  8
                Child1  6
          Par2  Child1  6
                Child3  3
                Child2  2
          Par1  Child1  3
    Gran1 Par1  Child2  7
                Child1  3
                Child3  2
          Par2  Child1  9
                Child2  2
          Par3  Child1  6

我想要的输出:

                    D
A     B     C

Gran1 Par2  Child1  9  <--
            Child2  2
Gran2 Par3  Child1  6
            Child2  8  <-- 
Gran1 Par1  Child1  3
            Child2  7  <--
            Child3  2
Gran2 Par2  Child1  6  <--
            Child2  2
            Child3  3
      Par1  Child1  4  <--
Gran1 Par3  Child1  2  <--

如您所见,我希望将A + B索引对及其所有子级中的所有子项都放在顶部,同时将B索引中的其他值分开。尝试进行这种排序(但不必要)时,使子索引C的子顺序保持一致是有帮助的。谢谢您对这个问题的任何帮助!

编辑:我还希望以相反的顺序进行操作,以使每个祖父母索引中的最小值升至顶部。请注意,此示例与上面的示例无关。

所需的输出:


                         D
    A     B     C

    Gran1 Par2  Child1  -15  
                Child2  -175  <--
                Child3  -65
    Gran2 Par3  Child1  -77   <--
                Child2   8     
    Gran1 Par1  Child1   3
                Child2   7  
                Child3  -12   <--
    Gran2 Par2  Child1   6    <--
                Child2   2
                Child3   3
          Par1  Child1   12  <--
    Gran1 Par3  Child1   24  <--

我得到的输出:

                     D
A     B     C

Gran2 Par3  Child1  -77   <--
            Child2   8     
Gran1 Par2  Child1  -15  
            Child2  -175  <--
            Child3  -65
      Par1  Child1   3
            Child2   7  
            Child3  -12   <--
Gran2 Par2  Child1   6    <--
            Child2   2
            Child3   3
      Par1  Child1   12  <--
Gran1 Par3  Child1   24  <--

Edit2 :根据文本的答案,我的第二个问题的答案是df.iloc[(df.groupby(level=[0,1]).D.transform('min')).argsort().values]

1 个答案:

答案 0 :(得分:0)

好像您需要import React from 'react' import PropTypes from 'prop-types' import { withStyles } from '@material-ui/core/styles' import Card from '@material-ui/core/Card' import CardActionArea from '@material-ui/core/CardActionArea' import CardActions from '@material-ui/core/CardActions' import CardContent from '@material-ui/core/CardContent' import CardMedia from '@material-ui/core/CardMedia' import Button from '@material-ui/core/Button' import Typography from '@material-ui/core/Typography' const styles = { card: { maxWidth: 345 }, media: { height: 140 } } function Grid(props) { const { classes } = props return ( <Card className={classes.card}> <CardActionArea> <CardMedia className={classes.media} image="../resources/functional.png" title="Functional Programming" /> <CardContent> <Typography gutterBottom variant="h4" component="h4"> Functional Programming </Typography> <Typography component="p"> Functional Programming is a paradigm—a style of building the structure and elements of computer programs—that treats computation as the{' '} <b> evaluation of mathematical functions and avoids changing-state and mutable data </b> . </Typography> </CardContent> </CardActionArea> <CardActions> <Button size="small" color="primary"> SEE MORE </Button> </CardActions> </Card> ) } Grid.propTypes = { classes: PropTypes.object.isRequired } export default withStyles(styles)(Grid)

argsort