Я хотел бы сгруппировать фрейм данных, используя два столбца, затем отфильтровать результаты, которые имеют значение, меньшее некоторого порогового значения, и затем принять соотношение средних значений.
Пример:
grouped_df = df_test[["bool_column", "A", "B",
"C", "filter_column"]].groupby(["filter_column", "bool_column"])
grouped_df.describe()
Это дает мне что-то вроде:
bool_column A B C
filter_column
Name1 True <stats> <stats> <stats> [count = 4]
False <stats> <stats> <stats> [count = 2]
Name2 True <stats> <stats> <stats> [count = 3]
False <stats> <stats> <stats> [count = 1]
Теперь я хочу отфильтровать те поля, где количество <2. Итак, я хочу: </p>
bool_column A B C
filter_column
Name1 True <stats> <stats> <stats> [count = 4]
False <stats> <stats> <stats> [count = 2]
Name2 True <stats> <stats> <stats> [count = 3]
После этого я хочу взять соотношение средних значений столбцов A
, B
и C
.То есть для каждого столбца фильтра мне нужно
colA[True].mean / colb[False].mean
Я все равно не мог заставить фильтр работать.Я попробовал следующее:
grouped_df2 = grouped_df.filter(lambda x: len(x) > 1)
grouped_df2 = grouped_df2.stack()
grouped_df = grouped_df.filter(lambda x: len(x) > 0)
Следующие работы, чтобы получитьсоотношение:
df = grouped_df['A'].mean().unstack('bool_column')
df = df[(df[True] > 0) & (df[False] > 0)]
df['ratio'] = df[True] / df[False]
df = df.drop(columns=[True,False])
df.plot(kind='bar')