【问题标题】:Python Pandas: aggregate large subset of columns without explicitly typing them outPython Pandas:聚合列的大子集而不显式输入它们
【发布时间】:2017-10-04 02:06:25
【问题描述】:

我正在尝试对我的数据框进行聚合。问题是我需要汇总超过一百列。现在我把它们都这样打出来了

df_grouped = df.groupby(['Column1'])['Column2','Column3','Column4','Column5'].sum()

直到最后一列。如果必须进行更改,则非常烦人且难以维护。有没有办法在不明确输入的情况下引用这些列?

【问题讨论】:

  • 您要排除除 Column1 之外的任何列吗?
  • 是的,数据框中还有更多列我既不想分组也不想总结。
  • 如果您觉得我们的回答对您有帮助,请不要忘记接受我们的回答。

标签: python pandas dataframe subset aggregation


【解决方案1】:

您可以按差异定义列:

df_grouped = df.groupby(['Column1'])[
    df.columns.difference(columns_to_exclude + ['Column1'])
].sum()

注意,difference 方法使用集合,因此不能保证列的顺序。

【讨论】:

  • 谢谢,我没有意识到您可以在 [] 括号之间使用任何函数。不幸的是,我必须排除几乎所有需要包含的内容,但我想我也可以在括号之间使用索引引用?
  • 这取决于您如何定义要排除的列,但我确信界面非常灵活(例如参见其他答案)。
【解决方案2】:

如果您可以选择带有条件的所需列,这是一种超级简单的方法。我偶尔会使用此方法,但不会用于超过 100 列,因此我不确定性能影响。

对于示例 df:

df
   a   b   c  bb
0  1   4   4   4
1  2   5   5   5
2  7  87  87  87
3  5   6   6   6

使用列表推导:

df[[i for i in df.columns if 'b' in i]]
   b  bb
0   4   4
1   5   5
2  87  87
3   6   6

这显然可以用于您喜欢的任何条件。

df_grouped = df.groupby(['Column1'][[i for i in df.columns if 'b' in i]].sum()

使用我的超级简单的例子,一些并排的表现:

%timeit df[[i for i in df.columns if 'b' in i]]
1000 loops, best of 3: 394 µs per loop

%timeit df[df.columns.difference(['a','c'])]
1000 loops, best of 3: 598 µs per loop

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 2012-09-01
    • 2013-08-08
    • 2019-07-09
    • 1970-01-01
    相关资源
    最近更新 更多