我正在尝试通过调用df.groupby('index_column').max()
和df.groupby('index_column').min()
从这个更大的DataFrame中创建更小的DataFrame,其中index_column
是我想要的df
列成为新的Min和Max DataFrames的索引。在这些Min和Max DataFrame中,我希望只有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]:
当我在max()
之后调用min()
和groupby('build_number')
方法时,我会得到以下数据框,这些数据框包含df
中显示的相同列,如下所示:< / p>
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()
时,情况也是如此。
但是,我想要的只是一个只有build_number
作为索引列的DataFrame,而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]:
所以我的问题是:
当我致电mean()
和min()
时,如何让我的输出成为我想要的输出(调用max()
时的格式?)? / p>
为什么当我致电mean()
时,生成的DataFrame会删除所有其他非数字列,但min()
和max()
不会消除其他非数字列?
非常感谢你的帮助!
答案 0 :(得分:2)
基本上您需要做的是过滤结果与您想要的列,如下所示:
@cwharland指出编辑,在应用 max()/ min()之前过滤周期更有效
df.groupby('build_number')['cycles'].max()
和
df.groupby('build_number')['cycles'].min()
使用 mean()的原因仅显示cycles
列是因为 mean 没有定义来获取的平均值字符串与parameters
类似,均值是cycles
的平均记录,而 max()和 min()只会返回单个记录(最大值/最小值),因此显示该记录中的所有列,是否有意义?
已更新:为了使此更清晰,每个字段中的数字值可以使用均值/最大/最小值操作执行自己的值,并相应地返回值,字符串,但只有最大值/分钟,按字典顺序排序,如'A' < 'C'
,'Z' > 'B'
等,但它不能执行mean()操作,因为它不是数字。
只有在groupby
适用时,所有单个列才会返回自己的最大/最小/平均值。
作为旁注:过滤后的 max()和 min()结果更可能是系列比 DataFrame 。
因此,要从结果中获取新的 DataFrame ,您只需执行以下操作:
df_max = pd.DataFrame(df.groupby('build_number')['cycles'].max())
df_min = pd.DataFrame(df.groupby('build_number')['cycles'].min())
我希望这会有所帮助。