Неверный индекс группы Панд - PullRequest
2 голосов
/ 27 сентября 2019

Возможно, я неправильно понимаю, что делает функция 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 ]

1 голос
/ 27 сентября 2019

Возможно, ошибка, но если преобразовать индекс в 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
0 голосов
/ 27 сентября 2019

Я думаю, это ошибка в 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
...