如何在分组组的第一个值之前取值

时间:2019-08-15 02:52:58

标签: python-3.x pandas numpy pandas-groupby

在对数据应用groupby之后,我想保存一些值。我在数据框中有两列,x1和x2。通过x2列应用groupby函数,并在group的第一个值之前从x1获取值。

df=pd.DataFrame({'x1':[3,4,5,6,7,8,9,2,7],x2:[1,3,3,3,2,2,2,2]})
   x1  x2
0   3   1
1   4   3
2   5   3
3   6   3
4   7   2
5   8   2
6   9   2
7   2   2
8   7   2

desired output:

df_out=pd.DataFrame({'x1_value':[3,6]})
      x1_value
0         3
1         6

3 个答案:

答案 0 :(得分:1)

设置

Q

您可以将x2分组移动1个位置,然后取第一个x1。

df=pd.DataFrame({'x1':[3,4,5,6,7,8,9,2,7],'x2':[1,3,3,3,2,2,2,2,2]})

x1  x2
0   3   1
1   4   3
2   5   3
3   6   3
4   7   2
5   8   2
6   9   2
7   2   2
8   7   2

构建临时列的另一个更复杂的解决方案:

df.groupby(df.x2.shift(-1),sort=False).x1.first()

x2
3    3.0
2    6.0
Name: x1_new, dtype: float64

答案 1 :(得分:1)

这是使用熊猫0.25中的nth的一种方式:

  window.googletag = window.googletag || {cmd: []};
  googletag.cmd.push(function() {
    var w = Math.max(
     document.body.scrollWidth,
     document.documentElement.scrollWidth,
     document.body.offsetWidth,
     document.documentElement.offsetWidth,
     document.documentElement.clientWidth
    );
    if(w>=970) {
        googletag.defineSlot('/00000000000/ad', [[970, 90], [728, 90], [468, 60], [320, 50], [300, 100], [234, 60]], 'div-gpt-ad-00000000000000-0').addService(googletag.pubads());
    } else if(w>=728) {
        googletag.defineSlot('/00000000000/ad', [[728, 90], [468, 60], [320, 50], [300, 100], [234, 60]], 'div-gpt-ad-00000000000000-0').addService(googletag.pubads());
    } else if(w>=468) {
        googletag.defineSlot('/00000000000/ad', [[468, 60], [320, 50], [300, 100], [234, 60]], 'div-gpt-ad-00000000000000-0').addService(googletag.pubads());
    } else if(w>=320) {
        googletag.defineSlot('/00000000000/ad', [[320, 50], [300, 100], [234, 60]], 'div-gpt-ad-00000000000000-0').addService(googletag.pubads());
    } else if(w>=300) {
        googletag.defineSlot('/00000000000/ad', [[300, 100], [234, 60]], 'div-gpt-ad-00000000000000-0').addService(googletag.pubads());
    } else if(w>=234) {
        googletag.defineSlot('/00000000000/ad', [[234, 60]], 'div-gpt-ad-00000000000000-0').addService(googletag.pubads());
    } else {
        googletag.defineSlot('/00000000000/ad', [], 'div-gpt-ad-00000000000000-0').addService(googletag.pubads());
    }
    googletag.pubads().enableSingleRequest();
    googletag.pubads().collapseEmptyDivs();
    googletag.enableServices();
  });

输出:

df=pd.DataFrame({'x1':[3,4,5,6,7,8,9,2,7],'x2':[1,3,3,3,2,2,2,2,2]})

df.groupby('x2', sort=False).nth(-1)[:-1]

详细信息:

  • 按x2进行分组,其中sort = False
  • 使用 x1 x2 1 3 3 6 获取每个组的最后一个值
  • 切片以消除最后一组中的最后一个值

答案 2 :(得分:1)

以您的情况

df.groupby('x2').tail(1).iloc[:-1]
   x1  x2
0   3   1
3   6   3