【问题标题】:Reassign Pandas DataFrame with groupby and mean使用 groupby 和 mean 重新分配 Pandas DataFrame
【发布时间】:2021-03-09 17:05:13
【问题描述】:

如何在 DataFrame 上使用 groupby 和 mean,同时保留所有非数字列?
示例:

     ID    label_1    label_2    label_3    label_4
0     1    0.582152     13          A       False
1     1    0.177475     3           A       False
2     2    0.263141     13          B       True
3     2    0.630196     3           B       True

预期输出:

     ID    label_1    label_2    label_3    label_4
0     1    0.379814     8.0         A       False
1     2    0.446669     8.0         B       True

有什么简单的方法吗?我可以在this answer 之后得到我想要的结果,但它按所有非数字列分组,并且不保持原始列顺序。我想按“ID”对数据进行分组并获取所有数字列的平均值,保留所有其他非数字列。这是我的代码:

# Group data and get mean
data = data.groupby(list(data.select_dtypes(exclude=np.number))).agg(np.mean).reset_index()
# Reordering the columns to the original order
data = data[[*data.select_dtypes(include=np.number).columns,
    *data.select_dtypes(exclude=np.number).columns]]

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    类似的东西

    df.groupby('ID').agg({'label_1':'mean', 'label_2':'mean', 'label_3':'first', 'label_4':'first'}).reset_index()
    

    agg 与不同的功能一起用于不同的列。产生

    
        ID      label_1     label_2 label_3 label_4
    0   1       0.379814    8       A       False
    1   2       0.446668    8       B       True
    

    要根据列的类型以编程方式生成列到聚合函数的映射,您可以使用

    from pandas.api.types import is_numeric_dtype
    num_str_f = {True: 'mean', False:'first'}
    agg_map = {col: num_str_f[is_numeric_dtype(dtp)]  for col,dtp in zip(df.columns,df.dtypes)}
    agg_map
    

    得到

    {'ID': 'mean',
     'label_1': 'mean',
     'label_2': 'mean',
     'label_3': 'first',
     'label_4': 'mean'}
    

    这样你就可以使用

    df.groupby('ID', as_index = False).agg(agg_map).reset_index()
    

    结果和上面一样

    【讨论】:

    • 有什么方法可以和select_dtypes一起使用吗?我的列太多了
    • @CaioRocha 啊现在我明白你在追求什么了。编辑了从列类型创建 agg_map 的答案
    【解决方案2】:

    尝试检查 agg 中的列类型

    df.groupby('ID').agg(lambda x : x.head(1) if x.dtype=='object' else x.mean())
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    猜你喜欢
    • 2021-05-18
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 2019-01-31
    • 2020-04-26
    • 2016-05-14
    相关资源
    最近更新 更多