我尝试从每个组的第一行中提取列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)
的行为不同。
答案 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。