【问题标题】:Aggregate and Convert categorical data to numbers汇总分类数据并将其转换为数字
【发布时间】:2019-06-17 07:01:41
【问题描述】:
我有一个数据框 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
【问题讨论】:
标签:
python
python-3.x
pandas
python-2.7
【解决方案1】:
将numpy.select 与Series.str.startswith 和Series.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
【解决方案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
【解决方案3】:
你可以使用:
df.loc[df['col'].str.startswith('ABC'), 'col'] = 1
df.loc[df['col'].str.contains(r'ROM|R&OM', na=False), 'col'] = 2