【问题标题】:Factorize a column of strings in pandas在熊猫中分解一列字符串
【发布时间】:2018-04-18 20:47:42
【问题描述】:

正如问题所说,我有一个数据框 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 值分别替换为10。有没有办法做到这一点,而我不必手动进入并更改值?

【问题讨论】:

  • For-loop 和 if-else 语句并使用 replace 方法或正则表达式
  • 类似df['Column 3']=df['Column 3'].replace({'yes.':1,'no.':0}) ?
  • df_original.Column3 = df_original.Column3.apply(lambda x : int(x == 'yes.')) 不够吗?

标签: python pandas dataframe categorical-data


【解决方案1】:
series

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 - series.factorize()[0]
array([1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0])
    

np.where

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

pd.Categorical/astype('category')

pd.Categorical(series).codes
array([1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0], dtype=int8)
series.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

series.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

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

series.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

【讨论】:

  • 我想让这个网站只有你的简洁答案~:-)
猜你喜欢
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 2014-02-20
  • 2020-10-16
  • 2017-02-16
  • 2018-02-04
  • 2017-02-07
相关资源
最近更新 更多