在第n个之前选择列会中断组索引

时间:2015-12-12 07:32:15

标签: python pandas

我尝试从每个组的第一行中提取列c,但很难理解为什么不使用g['c'].nth(0)方法保留组索引。有什么想法吗?

>>> df = pd.DataFrame({'a': [1, 1, 2, 2], 'b': ['b', 'b', 'b', 'a'], 'c': [1, 2, 3, 4]})
>>> g = df.groupby(['a', 'b'])
>>> g.nth(0)
     c
a b   
1 b  1
2 a  4
  b  3
>>> g['c'].nth(0)
0    1
2    3
3    4
Name: c, dtype: int64
>>> 
>>> df = pd.DataFrame({'a': [1, 1, 2, 2], 'b': ['b', 'b', 'b', 'a'], 'c': [1, 2, 3, 4]})
>>> g = df.groupby(['a', 'b'])
>>> g.nth(0)
     c
a b   
1 b  1
2 a  4
  b  3
>>> g['c'].nth(0)
0    1
2    3
3    4
Name: c, dtype: int64
>>> g.nth(0)['c']
a  b
1  b    1
2  a    4
   b    3
Name: c, dtype: int64
>>> 

为什么g.nth(0)['c']g['c'].nth(0)不会返回相同的系列(包括索引)?

更新

有趣的观察:

>>> g['c'].first()
a  b
1  b    1
2  a    4
   b    3
Name: c, dtype: int64

这正是我想要的,与g['c'].nth(0)的行为不同。

1 个答案:

答案 0 :(得分:1)

我添加新列d以便更好地进行测试:

import pandas as pd
import numpy as np
import io


df = pd.DataFrame({'a': [1, 1, 2, 2], 'b': ['b', 'b', 'b', 'a'], 'c': [1, 2, 3, 4], 'd': [1, 2, 3, 4]})
print df
#   a  b  c  d
#0  1  b  1  1
#1  1  b  2  2
#2  2  b  3  3
#3  2  a  4  4
g = df.groupby(['a', 'b'])

#return SeriesGroupBy object and then apply nth
print g['c'] 
#<pandas.core.groupby.SeriesGroupBy object at 0x0000000014ED4EF0>
print g['c'].head()
#0    1
#1    2
#2    3
#3    4
#Name: c, dtype: int64
print g['c'].nth(0)
#0    1
#2    3
#3    4
#Name: c, dtype: int64
#return dataframe and then select c
print g.nth(0) 
#     c  d
#a b      
#1 b  1  1
#2 a  4  4
#  b  3  3
print g.nth(0)['c']
#a  b
#1  b    1
#2  a    4
#   b    3
#Name: c, dtype: int64

编辑:

  

为什么我需要将nth应用于整个分组数据框

因为您需要先为所有组应用函数nth,然后获取第一行组。我试着用第二种方法。

在第一种方法中,您只需将C列与已计算的分组link一起传递给Series GroupBy object(查找New: Column selection)。 它在一起df.groupby(['a', 'b'])['c'],然后应用函数nth。不适用于所有群组df.groupby(['a', 'b'])

我认为有链式函数,它取决于函数的排序。

EDIT1:

最后我报告了它 - 它看起来像bug