Я изучаю Python и Pandas и делаю некоторые упражнения, чтобы понять, как все работает. У меня следующий вопрос: могу ли я использовать метод GroupBy.filter (), чтобы выбрать строки DataFrame, которые имеют значение (в определенном столбце), превышающее среднее значение соответствующей группы?
Для этого упражненияЯ использую набор данных "планеты", включенный в Seaborn: 1035 строк x 6 столбцов (имена столбцов: "метод", "число", "orbital_period", "масса", "расстояние", "год").
В python:
import pandas as pd
import seaborn as sns
#Load the "planets" dataset included in Seaborn
data = sns.load_dataset("planets")
#Remove rows with NaN in "orbital_period"
data = data.dropna(how = "all", subset = ["orbital_period"])
#Set display of DataFrames for seeing all the columns:
pd.set_option("display.max_columns", 15)
#Group the DataFrame "data" by "method" ()
group1 = data.groupby("method")
#I obtain a DataFrameGroupBy object (group1) composed of 10 groups.
print(group1)
#Print the composition of the DataFrameGroupBy object "group1".
for lab, datafrm in group1:
print(lab, "\n", datafrm, sep="", end="\n\n")
print()
print()
print()
#Define the filter_function that will be used by the filter method.
#I want a function that returns True whenever the "orbital_period" value for
#a row is greater than the mean of the corresponding group's mean.
#This could have been done also directly with "lambda syntax" as argument
#of filter().
def filter_funct(x):
#print(type(x))
#print(x)
return x["orbital_period"] > x["orbital_period"].mean()
dataFiltered = group1.filter(filter_funct)
print("RESULT OF THE FILTER METHOD:")
print()
print(dataFiltered)
print()
print()
К сожалению, я получаю следующую ошибку при запуске сценария.
TypeError: filter function returned a Series, but expected a scalar bool
Похоже, что x ["orbital_period"] не ведет себя каквектор, что означает, что он не возвращает единственные значения Series ... достаточно странно, что метод transform () не страдает от этой проблемы. Действительно, в том же наборе данных (подготовленном, как описано выше), если я запускаю следующее:
#Define the transform_function that will be used by the transform() method.
#I want this function to subtract from each value in "orbital_period" the mean
#of the corresponding group.
def transf_funct(x):
#print(type(x))
#print(x)
return x-x.mean()
print("Transform method runs:")
print()
#I directly assign the transformed values to the "orbital_period" column of the DataFrame.
data["orbital_period"] = group1["orbital_period"].transform(transf_funct)
print("RESULT OF THE TRANSFORM METHOD:")
print()
print(data)
print()
print()
print()
Я получаю ожидаемый результат ...
Do DataFrameGroupBy.filter () и DataFrameGroupBy.transform () есть другое поведение? Я знаю, что могу достичь того, чего хочу, многими другими способами, но мой вопрос: есть ли способ добиться того, чего я хочу, используя метод DataFrameGroupBy.filter ()?