熊猫groupby索引不正确

时间:2019-09-27 08:24:04

标签: python pandas group-by apply

我可能会误解pd.GroupBy函数的作用,但是我认为这应该断言True.为什么要断言False

a = pd.DataFrame([range(3)]*3,index=map(str, range(3))).T
a.iloc[:,0] = [10, 11, 11]

a.groupby('0').apply(lambda x: print(x.index))

indexes = a.groupby('0').apply(lambda x: x.index)
print(indexes)

index_lengths = a.groupby('0').apply(lambda x: len(x.index))
print(index_lengths)

indexes_lengths = a.groupby('0').apply(lambda x: x.index).apply(len)
print(indexes_lengths)

assert indexes_lengths.equals(index_lengths), "Apply indexes are returning the wrong index"

2 个答案:

答案 0 :(得分:1)

可能是错误,但是如果将索引转换为list都可以正常工作:

indexes = a.groupby('0').apply(lambda x: list(x.index))
print(indexes)
0
10       [0]
11    [1, 2]
dtype: object

indexes_lengths = a.groupby('0').apply(lambda x: list(x.index)).apply(len)
print(indexes_lengths)
0
10    1
11    2
dtype: int64

index_lengths = a.groupby('0').apply(lambda x: len(x.index))
print(index_lengths)
0
10    1
11    2
dtype: int64

答案 1 :(得分:0)

我猜这是apply中的错误。如果您仍希望将输出作为index对象的列表,只需通过添加.copy

为每个组创建新的索引对象
a.groupby('0').apply(lambda x: x.index.copy())

Out[706]:
0
10       Int64Index([0], dtype='int64')
11    Int64Index([1, 2], dtype='int64')
dtype: object
len中的

index似乎没有遇到此错误

a.groupby('0').apply(lambda x: len(x.index))

Out[707]:
0
10    1
11    2
dtype: int64

仅当直接应用于index时,才会出现此错误。因此,添加.copy会根据您的意愿返回

a.groupby('0').apply(lambda x: x.index.copy()).apply(len)

Out[708]:
0
10    1
11    2
dtype: int64