在熊猫中分解一列字符串

发布于 2021-01-29 19:31:25

如问题所述,我有一个df_original很大的数据框,但看起来像:

        ID    Count   Column 2   Column 3  Column 4
RowX    1      234.     255.       yes.      452
RowY    1      123.     135.       no.       342
RowW    1      234.     235.       yes.      645
RowJ    1      123.     115.       no.       342
RowA    1      234.     285.       yes.      233
RowR    1      123.     165.       no.       342
RowX    2      234.     255.       yes.      234
RowY    2      123.     135.       yes.      342
RowW    2      234.     235.       yes.      233
RowJ    2      123.     115.       yes.      342
RowA    2      234.     285.       yes.      312
RowR    2      123.     165.       no.       342
.
.
.
RowX    1233   234.     255.       yes.      133
RowY    1233   123.     135.       no.       342
RowW    1233   234.     235.       no.       253
RowJ    1233   123.     115.       yes.      342
RowA    1233   234.     285.       yes.      645
RowR    1233   123.     165.       no.       342

我试图摆脱文本数据,并将其替换为预定义的数值等效项。例如,在这种情况下,我想分别用或替换Column3yesno值。有没有一种方法无需我手动输入和更改值?1``0

关注者
0
被浏览
49
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。
    v
    
    RowX    yes
    RowY     no
    RowW    yes
    RowJ     no
    RowA    yes
    RowR     no
    RowX    yes
    RowY    yes
    RowW    yes
    RowJ    yes
    RowA    yes
    RowR     no
    Name: Column 3, dtype: object
    

    pd.factorize

    1 - pd.factorize(v)[0]
    array([1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0])
    

    np.where

    np.where(v == 'yes', 1, 0)
    array([1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0])
    

    pd.Categorical/astype('category')

    pd.Categorical(v).codes
    array([1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0], dtype=int8)
    
    
    
    v.astype('category').cat.codes
    
    RowX    1
    RowY    0
    RowW    1
    RowJ    0
    RowA    1
    RowR    0
    RowX    1
    RowY    1
    RowW    1
    RowJ    1
    RowA    1
    RowR    0
    dtype: int8
    

    pd.Series.replace

    v.replace({'yes' : 1, 'no' : 0})
    
    RowX    1
    RowY    0
    RowW    1
    RowJ    0
    RowA    1
    RowR    0
    RowX    1
    RowY    1
    RowW    1
    RowJ    1
    RowA    1
    RowR    0
    Name: Column 3, dtype: int64
    

    上面的一个有趣的通用版本:

    v.replace({r'^(?!yes).*$' : 0}, regex=True).astype(bool).astype(int)
    
    RowX    1
    RowY    0
    RowW    1
    RowJ    0
    RowA    1
    RowR    0
    RowX    1
    RowY    1
    RowW    1
    RowJ    1
    RowA    1
    RowR    0
    Name: Column 3, dtype: int64
    

    一切都不"yes"0



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看