Pandas:根据值在范围内的位置指定类别

2024-04-23 06:46:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下范围和熊猫数据框:

x >= 0        # success
-10 <= x < 0  # warning
X < -10       # danger

df = pd.DataFrame({'x': [2, 1], 'y': [-7, -5], 'z': [-30, -20]})

我想根据值在定义范围内的位置对数据框中的值进行分类。所以我希望最后的测向仪看起来像这样:

    x    y    z    x_cat    y_cat    z_cat
0   2   -7  -30  success  warning   danger
1   1   -5  -20  success  warning   danger

我尝试过使用category数据类型,但似乎我无法在任何地方定义范围。

for category_column, value_column in zip(['x_cat', 'y_cat', 'z_cat'], ['x', 'y', 'z']):
    df[category_column] = df[value_column].astype('category')

我可以使用category数据类型吗?如果没有,我在这里能做什么?


Tags: 数据dataframedf定义value地方分类column
3条回答

您可以编写一个小函数,然后使用apply将每个序列传递给该函数:

df = pd.DataFrame({'x': [2, 1], 'y': [-7, -5], 'z': [-30, -20]})

def cat(x):
    if x <-10:
        return "Danger"
    if x < 0:
        return "Warning"
    return "Success"

for col in df.columns:
    df[col] = df[col].apply(lambda x: cat(x))

可以使用assign创建新列。对于每个新列,使用apply来筛选序列。

df.assign(x_cat = lambda v: v.x.apply(lambda x: 'Sucess' if x>=0 else None),
         y_cat = lambda v: v.y.apply(lambda x: 'warning' if -10<=x<0 else None),
         z_cat = lambda v: v.z.apply(lambda x: 'danger' if x<=-10 else None),)

会导致

    x   y   z   x_cat   y_cat   z_cat
0   2   -7  -30 Sucess  warning danger
1   1   -5  -20 Sucess  warning danger

pandas.cut

c = pd.cut(
    df.stack(),
    [-np.inf, -10, 0, np.inf],
    labels=['danger', 'warning', 'success']
)
df.join(c.unstack().add_suffix('_cat'))

   x  y   z    x_cat    y_cat   z_cat
0  2 -7 -30  success  warning  danger
1  1 -5 -20  success  warning  danger

numpy

v = df.values
cats = np.array(['danger', 'warning', 'success'])
code = np.searchsorted([-10, 0], v.ravel()).reshape(v.shape)
cdf = pd.DataFrame(cats[code], df.index, df.columns)
df.join(cdf.add_suffix('_cat'))

   x  y   z    x_cat    y_cat   z_cat
0  2 -7 -30  success  warning  danger
1  1 -5 -20  success  warning  danger

相关问题 更多 >