按条件分组并创建三个新列 [Low, Hit, High]
回答问题 我有一个大型数据集(约 5 Mio 行),其中包含机器学习训练的结果。现在我想检查结果是否达到“目标范围”。假设这个范围包含-0.25和+0.25之间的所有值。如果它在这个范围内,它是一个Hit,如果它低于Low,另一边是High。 我现在将创建这三列 Hit、Low、High 并为每一行计算适用的条件并将1放入该列中,另外两列将变为0。之后,我会对这些值进行分组并总结它们。但是我怀疑肯
·
回答问题
我有一个大型数据集(约 5 Mio 行),其中包含机器学习训练的结果。现在我想检查结果是否达到“目标范围”。假设这个范围包含-0.25
和+0.25
之间的所有值。如果它在这个范围内,它是一个Hit
,如果它低于Low
,另一边是High
。
我现在将创建这三列 Hit、Low、High 并为每一行计算适用的条件并将1
放入该列中,另外两列将变为0
。之后,我会对这些值进行分组并总结它们。但是我怀疑肯定有更好更快的方法,比如分组的时候直接计算。
资料
import pandas as pd
df = pd.DataFrame({"Type":["RF", "RF", "RF", "MLP", "MLP", "MLP"], "Value":[-1.5,-0.1,1.7,0.2,-0.7,-0.6]})
+----+--------+---------+
| | Type | Value |
|----+--------+---------|
| 0 | RF | -1.5 | <- Low
| 1 | RF | -0.1 | <- Hit
| 2 | RF | 1.7 | <- High
| 3 | MLP | 0.2 | <- Hit
| 4 | MLP | -0.7 | <- Low
| 5 | MLP | -0.6 | <- Low
+----+--------+---------+
预期输出
pd.DataFrame({"Type":["RF", "MLP"], "Low":[1,2], "Hit":[1,1], "High":[1,0]})
+----+--------+-------+-------+--------+
| | Type | Low | Hit | High |
|----+--------+-------+-------+--------|
| 0 | RF | 1 | 1 | 1 |
| 1 | MLP | 2 | 1 | 0 |
+----+--------+-------+-------+--------+
Answers
您可以使用cut
来定义组和pivot_table
来重塑:
(df.assign(group=pd.cut(df['Value'],
[float('-inf'), -0.25, 0.25, float('inf')],
labels=['Low', 'Hit', 'High']))
.pivot_table(index='Type', columns='group', values='Value', aggfunc='count')
.reset_index()
.rename_axis(None, axis=1)
)
或crosstab
:
(pd.crosstab(df['Type'],
pd.cut(df['Value'],
[float('-inf'), -0.25, 0.25, float('inf')],
labels=['Low', 'Hit', 'High'])
)
.reset_index().rename_axis(None, axis=1)
)
输出:
Type Low Hit High
0 MLP 2 1 0
1 RF 1 1 1
更多推荐
已为社区贡献126473条内容
所有评论(0)