繁体   English   中英

汇总分类数据并将其转换为数字

[英]Aggregate and Convert categorical data to numbers

我有一个数据框df_train,其中有一列sub_division。

该列中的值如下所示

ABC_commercial,
ABC_Private,
Test ROM DIV,
ROM DIV,
TEST SEC R&OM

我正在尝试1.将以ABC *开头的任何内容转换为数字(例如:1)2.将包含ROM和R&OM的任何内容转换为数字(例如:2)

提前致谢。

预期结果:

1,
1,
2,
2,
2

numpy.selectSeries.str.startswithSeries.str.contains

m1 = df['col'].str.startswith('ABC')
m2 = df['col'].str.contains('ROM|R&OM')

df['new'] = np.select([m1, m2], [1,2], default='no match')
#if need all numbers
#df['new'] = np.select([m1, m2], [1,2], default=0)
print (df)
               col new
0  ABC_commercial,   1
1     ABC_Private,   1
2    Test ROM DIV,   2
3         ROM DIV,   2
4    TEST SEC R&OM   2

您可以执行以下操作。 请记住,如果没有匹配项,您将获得NaN 您可以在converter函数中添加else大小写,以获取默认值。

def converter(v):
    if v.startswith('ABC'):
        return 1
    elif any(i in v for i in ['ROM', 'R&OM']):
        return 2

df['sub_division'] = df['sub_division'].apply(converter)
print(df.head(10))

输出:

   sub_division
0             1
1             1
2             2
3             2
4             2

您可以使用:

df.loc[df['col'].str.startswith('ABC'), 'col'] = 1
df.loc[df['col'].str.contains(r'ROM|R&OM', na=False), 'col'] = 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM