【问题标题】:Pandas group by multiple columns, filter and take ratio of averages熊猫按多列分组,过滤并取平均值的比率
【发布时间】:2019-09-20 11:15:30
【问题描述】:

我想使用两列对数据框进行分组,然后过滤小于某个阈值的结果,然后取平均值的比率。

例子:

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]

我现在想过滤掉 count

                   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]

在此之后,我想取列 ABC 的均值比率。那是对于每个过滤器列,我需要

colA[True].mean / colb[False].mean

我还是无法让过滤器工作。我尝试了以下方法:

  1. grouped_df2 = grouped_df.filter(lambda x: len(x) &gt; 1)
  2. grouped_df2 = grouped_df2.stack()
  3. grouped_df = grouped_df.filter(lambda x: len(x) &gt; 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')

【问题讨论】:

  • 删除一些行后,你想如何计算比率?例如。在您的示例中,Name2 没有 False。
  • 我会忽略它,我不需要在输出中使用它。 @Shaido

标签: python pandas lambda filter pandas-groupby


【解决方案1】:

这是一种可能的解决方案,首先汇总每组的平均值和计数:

df = grouped_df.agg([np.mean, 'count'])

然后过滤计数过低的行:

df = df[df['A', 'count'] > 1]

删除不必要的计数列并重命名:

df = df.drop('count', axis=1, level=1)
df.columns = df.columns.get_level_values(0)

要计算均值,首先取消堆叠bool_column,然后为每个数据列添加新的ratio 列:

df = df.unstack()

for col in df.columns.get_level_values(0).unique():
    df[col, 'ratio'] = df[col, True] / df[col, False]

最后,只选择ratio 列:

df.iloc[:, df.columns.get_level_values(1) == 'ratio']

结果:

                  A      B
  bool_column     ratio  ratio
filter_column       
            1       NaN    NaN
            2  0.857143  0.875

【讨论】:

    猜你喜欢
    • 2018-12-21
    • 1970-01-01
    • 2018-02-01
    • 2017-06-26
    • 2022-11-18
    • 2020-04-20
    • 2015-07-18
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多