对于数据框,我用一系列值替换了一列中的项目,如下所示:
df['borough_num'] = df['Borough'].replace(regex=['MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND','BRONX'], value=[1, 2, 3, 4,5])
我想要替换之前未提及的值为0的'Borough'中所有其余元素的问题我也需要使用正则表达式,因为看起来像数据,例如 . 07 BRONX,我还需要将其替换为5而不是0
你也可以使用np.where:
创建一个虚拟DataFrame
df = pd.DataFrame({'Borough': ['MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND','BRONX', 'TEST']}) df Borough 0 MANHATTAN 1 BROOKLYN 2 QUEENS 3 STATEN ISLAND 4 BRONX 5 TEST
你的行动:
df['borough_num'] = df['Borough'].replace(regex=['MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND','BRONX'], value=[1, 2, 3, 4,5]) df Borough borough_num 0 MANHATTAN 1 1 BROOKLYN 2 2 QUEENS 3 3 STATEN ISLAND 4 4 BRONX 5 5 TEST TEST
使用np.where替换列中的Borough值而不是0中的键:
keys = ['MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND','BRONX'] df['Borough'] = np.where(~df['Borough'].isin(keys), 0 ,df['Borough']) df Borough borough_num 0 MANHATTAN 1 1 BROOKLYN 2 2 QUEENS 3 3 STATEN ISLAND 4 4 BRONX 5 5 0 TEST
我看到你想用一些强加的顺序执行类别编码 . 我建议使用 pd.Categorical 与 ordered=True :
pd.Categorical
ordered=True
df = pd.DataFrame({ 'Borough': ['QUEENS', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'INVALID']}) df Borough 0 QUEENS 1 BRONX 2 MANHATTAN 3 BROOKLYN 4 INVALID keys = ['MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND','BRONX'] df['borough_num'] = pd.Categorical( df['Borough'], categories=keys, ordered=True).codes+1 df Borough borough_num 0 QUEENS 3 1 BRONX 5 2 MANHATTAN 1 3 BROOKLYN 2 4 INVALID 0
pd.Categorical 将无效字符串返回为-1:
pd.Categorical( df['Borough'], categories=keys, ordered=True).codes array([ 2, 4, 0, 1, -1], dtype=int8)
无论如何,这应该比使用 replace 快得多,但作为参考,你可以用 replace 和字典做到这一点:
replace
from collections import defaultdict d = defaultdict(int) d.update(dict(zip(keys, range(len(keys))))) df['borough_num'] = df['Borough'].map(d) df Borough borough_num 0 QUEENS 2 1 BRONX 4 2 MANHATTAN 0 3 BROOKLYN 1 4 INVALID 0
要将所有其他值替换为0,您可以执行以下操作:
# create maps new_values = ['MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND','BRONX'] maps = dict(zip(new_values, [1]*len(new_values))) # map the values df['borough_num'] = df['Borough'].apply(lambda x: maps.get(x, 0))
使用 map 和 fillna 来冷的数据,所有不在 Map dict 中的值都会返回 NaN ,那么我们只需 fillna
map
fillna
dict
NaN
df.Borough.map(dict(zip(['QUEENS', 'BRONX'],[1,2]))).fillna(0).astype(int) 0 1 1 2 2 2 3 0 Name: Borough, dtype: int32
4 回答
你也可以使用np.where:
创建一个虚拟DataFrame
你的行动:
使用np.where替换列中的Borough值而不是0中的键:
我看到你想用一些强加的顺序执行类别编码 . 我建议使用
pd.Categorical
与ordered=True
:pd.Categorical
将无效字符串返回为-1:无论如何,这应该比使用
replace
快得多,但作为参考,你可以用replace
和字典做到这一点:要将所有其他值替换为0,您可以执行以下操作:
使用
map
和fillna
来冷的数据,所有不在 Mapdict
中的值都会返回NaN
,那么我们只需fillna