Запустите функцию для каждой группы по df и используйте значение, которое генерирует функция (без возврата df)

#python #pandas #dataframe

Вопрос:

У меня есть более или менее простой вопрос, так как меня беспокоит мое текущее решение. Пожалуйста, обратите внимание, что приведенный код является лишь простым примером, и мне действительно не нужна длина группы, но я хочу сделать в ней еще кое-что в будущем.

Итак, мой текущий код выглядит следующим образом:

 mylist = []

def get_length(group):
    #do stuff with group e.g. return len
    geoRoutes.append(len(group))

df_.groupby(["A","B","C","D"]).apply(get_count)
 

То, что я хочу иметь, — это что-то вроде этого:

 def get_length(group):
    #do stuff with group e.g. return len
    return len(group)

myList = []

myList.append(df_.groupby(["A","B","C","D"]).apply(get_count))
 

Другими словами, мне было интересно, существует ли аналогичная функция, такая как apply, которая не будет пытаться изменить фрейм данных, а буквально просто выполнит функцию для каждой строки/подмножества фрейма.

Комментарии:

1. Я считаю, .apply что с inplace=False помощью set (который используется по умолчанию) не изменяет набор данных и возвращает новый. Так apply что делает именно то, что вы хотите.

2. да, но он подумал, что может быть решение, при котором набор данных вообще не возвращается. Так что просто функция apply, где я могу использовать возвращаемое значение: в данном случае длина группы в разделенном списке, которая вообще не связана с исходным фреймом данных

3. Значит df_.groupby(["A","B","C","D"]).apply(get_count) , ничего не возвращает?

Ответ №1:

Я бы настоятельно рекомендовал выполнить обычную групповую проверку, а затем использовать tolist :

 df = pd.DataFrame({"a": [1, 1, 2], "b": [1, 1, 1]})
df.groupby("a").apply(len).tolist()

Out[1]: [2, 1]