【问题标题】:Trying to get the desired DataFrames from optimized groupby methods尝试从优化的 groupby 方法中获取所需的 DataFrame
【发布时间】:2026-01-29 23:55:02
【问题描述】:

我正在尝试通过调用df.groupby('index_column').max()df.groupby('index_column').min() 从这个更大的DataFrame 中创建更小的DataFrame,其中index_columndf 的列,我现在希望它成为新Min 的索引和最大数据帧。在这些 Min 和 Max DataFrames 中,我只想有 2 个简单的列,一个索引列,另一列分别只包含 Max 和 Min 值。

将我上面所说的所有内容放在上下文中,我将使用我所做的示例:

主 DataFrame df 在标准输出中如下所示:

In [3]: df
Out[3]: 
         name                                          parameter  cycles  \
0       dfmul  [["scheduler_type", "sdc"], ["max_chain_delay"...     159   
1       dfdiv  [["scheduler_type", "sdc"], ["max_chain_delay"...    1335   
2       mpeg2  [["scheduler_type", "sdc"], ["max_chain_delay"...    1992   
3         aes  [["scheduler_type", "sdc"], ["max_chain_delay"...   5441   
4        mips  [["scheduler_type", "sdc"], ["max_chain_delay"...    4263   
5       dfadd  [["scheduler_type", "sdc"], ["max_chain_delay"...     455   
6       dfsin  [["scheduler_type", "sdc"], ["max_chain_delay"...   39589      
..        ...                                                ...     ...    
403     adpcm  [["scheduler_type", "sdc"], ["max_chain_delay"...   23355   
404     dfadd  [["scheduler_type", "sdc"], ["max_chain_delay"...     599   
405       sha  [["scheduler_type", "sdc"], ["max_chain_delay"...  348417   
406  blowfish  [["scheduler_type", "sdc"], ["max_chain_delay"...  251877   
407      jpeg  [["scheduler_type", "sdc"], ["max_chain_delay"...  766742   

    mem_cycles  build_number  
0         None          1300  
1         None          1300  
2         None          1300  
3         None          1300  
4         None          1300  
..         ...           ...  
401       None          1344  
402       None          1344  
403       None          1344  
404       None          1344  
405       None          1344  
406       None          1344  
407       None          1344  

[408 rows x 5 columns]

In [4]: 

当我在groupby('build_number') 之后调用max()min() 方法时,我得到以下DataFrame,其中包含与df 中存在的相同列,如您所见:

In [5]: df.groupby('build_number').max()
Out[5]: 
             name                                          parameter  cycles  \
build_number                                                                   
1300          sha  [["scheduler_type", "sdc"], ["max_chain_delay"...  348417   
1301          sha  [["scheduler_type", "sdc"], ["max_chain_delay"...  348417   
1302          sha  [["scheduler_type", "sdc"], ["max_chain_delay"...  348417   

# And it continues so on, won't list the whole frame

              mem_cycles  
build_number              
1300                 NaN  
1301                 NaN  
1302                 NaN  
# And it continues so on, won't list the whole frame

In [6]: 

min() 也是如此。

但是,我想要返回的只是一个 DataFrame,它只有 build_number 作为索引列,cycles 作为它只有非索引列。事实上,如果我改为调用 mean() groupby 方法,就会得到这种所需的输出格式。

In [6]: df.groupby('build_number').mean()
Out[6]: 
                     cycles
build_number               
1300           42966.500000
1301           42992.000000
1302           42989.900000
1303           42985.300000

# And it continues so on, won't list the whole frame

In [7]: 

所以我的问题是:

  1. 当我调用min()max() 时,如何让我的输出成为我想要的输出(这是调用mean() 时的格式)?

  2. 为什么当我调用 mean() 时,生成的 DataFrame 已经消除了所有其他非数字列,但 min()max() 没有消除那些其他非数字列?

非常感谢您的帮助!

【问题讨论】:

    标签: python pandas group-by ipython dataframe


    【解决方案1】:

    基本上你需要做的是用你想要的过滤结果,像这样:

    编辑: 正如@cwharland 所指出的,在应用 ma​​x() / min()

    之前过滤周期更有效
    df.groupby('build_number')['cycles'].max()
    

    和,

    df.groupby('build_number')['cycles'].min()
    

    之所以使用 mean() 只会显示 cycles 列是因为 mean 没有定义来获取 String 就像在parameters 中一样,mean 是cycles 的这些记录的平均值,而 ma​​x()min() 只会返回一条记录(最大/最小),因此显示该记录中的所有列,是否有意义?

    更新:为了更清楚地说明这一点,每个字段中的数值值可以通过均值/最大值/最小值运算执行自己的操作并相应地返回值,字符串,但是只有最大值/最小值,按字典顺序排序,如'A' < 'C''Z' > 'B' 等,但它不能执行 mean() 操作,因为它不是数字。 只有在适用的情况下,所有单独的列都会在 groupby 之后返回它自己的最大值/最小值/平均值。

    附带说明:过滤后的 ma​​x()min() 结果更可能是一个系列 strong> 优于 DataFrame

    所以要从结果中得到一个新的DataFrame,你只需要这样做:

    df_max = pd.DataFrame(df.groupby('build_number')['cycles'].max())
    df_min = pd.DataFrame(df.groupby('build_number')['cycles'].min())
    

    我希望这会有所帮助。

    【讨论】:

    • 或者,为了提高速度,您可以简单地操作您希望在结果中包含的唯一列:df_max = pd.DataFrame(df.groupby('build_number').cycles.max()
    • 感谢大家的快速回复和帮助! @Anzel 关于您对我的第二个问题的回答,我想我大致明白您的意思,但是我需要澄清一下我对您的理解正确。所以你的意思是说,对于max()mean(),这些方法将返回一整行值,其所有列对应于最大值或最小值?
    • @Anzel 如果是这种情况,那么如果我有一个 DataFrame,其中有多个列具有数值,会发生什么?例如,如果在我上面的 DataFrame 中,mem_cycles 不是 NaN 而是有值怎么办?那么max()min() 应该如何工作以返回具有我需要的正确值的适当记录?
    • @AKKO,我已经更新了我的答案以提供更详细的解释,不是那么深入,但关键是,只有 numeric 值可以有它的 mean(), string 由于字典顺序可以有 max/min,但不能有 mean。只有在适用的情况下,所有单独的列都会在 groupby 之后返回它自己的最大值/最小值/平均值
    • @AKKO,绝对正确,只需要记住为什么 String 有 max/min 但 NOT 意思的部分——只有数值有意思:)