【问题标题】: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.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

【讨论】:

    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-12
        • 2021-08-23
        • 2017-02-13
        • 1970-01-01
        • 2013-07-14
        • 1970-01-01
        相关资源
        最近更新 更多