gpt4 book ai didi

python - 用 1 替换列中的任何字符串

转载 作者:行者123 更新时间:2023-11-28 21:58:03 25 4
gpt4 key购买 nike

我正在与 Pandas 打交道。我的目标是将数据框中的多个列从包含 NaN 或字符串数​​据转换为或多或少的虚拟变量(0 表示 NaN;1 表示任何字符串)。我想在不使用完整的字符串列表并逐个替换它们的情况下执行此操作,因为存在拼写错误,这会导致错误。我已经能够使用 fillna 函数将所有 NaN 数据替换为 0,这就像做梦一样!

我希望有类似的东西将所有字符串数据替换为 1,但保留 0。我搜索了 stackoverflow 和其他地方,但收效甚微。

数据大致如下所示,我只希望将其应用于以 T_ 开头的列:

    fol    T_opp    T_Dir    T_Enh   Activity
1 0 0 vo hf
2 vr 0 0 hx
2 0 0 0 fe
3 0 bt 0 rn

我希望输出看起来一样,但是“vr”、“bt”和“vo”分别替换为整数 1。据我所知,pd get_dummies 函数不是我想要的为了。我也无法使用 replace() 来完成这项工作。我尝试了一些使用 T/F 掩码和零列表的方法,但结果非常错误,我懒得在这里发布代码。

已编辑:我在上面的玩具数据中添加了一个附加列。 “事件”列是一些我不想触及的数据,也是字符串。

最佳答案

您可以使用带有正则表达式的 DataFrame.replace() 来做到这一点:

In [14]: df
Out[14]:
fol T_opp T_Dir T_Enh
0 1 0 0 vo
1 2 vr 0 0
2 2 0 0 0
3 3 0 bt 0

In [15]: df.replace(regex={'vr|bt|vo': '1'}).convert_objects(convert_numeric=True)
Out[15]:
fol T_opp T_Dir T_Enh
0 1 0 0 1
1 2 1 0 0
2 2 0 0 0
3 3 0 1 0

如果出于某种原因你反对 dict,你也可以非常明确地表达出来:

In [19]: df.replace(regex='vr|bt|vo', value='1')
Out[19]:
fol T_opp T_Dir T_Enh
0 1 0 0 1
1 2 1 0 0
2 2 0 0 0
3 3 0 1 0

但等等还有更多!您可以通过传递嵌套的 dict 指定要操作的列(键 不能 是正则表达式,嗯,它们可以,但除了返回框架):

In [22]: df.replace({'T_opp': {'vr': 1}, 'T_Dir': {'bt': 1}})
Out[22]:
fol T_opp T_Dir T_Enh
0 1 0 0 vo
1 2 1 0 0
2 2 0 0 0
3 3 0 1 0

编辑:由于您要用数字 1 替换所有字符串(根据您在下面的评论),请执行以下操作:

In [23]: df.replace(regex={r'\D+': 1})
Out[23]:
fol T_opp T_Dir T_Enh
0 1 0 0 1
1 2 1 0 0
2 2 0 0 0
3 3 0 1 0

编辑:微基准测试可能在这里很有用:

安迪的方法(更快):

In [11]: timeit df.convert_objects(convert_numeric=True).fillna(1)
1000 loops, best of 3: 590 µs per loop

DataFrame.replace():

In [46]: timeit df.replace(regex={r'\D': 1})
1000 loops, best of 3: 801 µs per loop

如果您有包含要保留的字符串的列

In [45]: cols_to_replace = 'T_opp', 'T_Dir', 'T_Enh'

In [46]: d = dict(zip(cols_to_replace, [{r'\D': 1}] * len(cols_to_replace)))

In [47]: d
Out[47]: {'T_Dir': {'\\D': 1}, 'T_Enh': {'\\D': 1}, 'T_opp': {'\\D': 1}}

In [48]: df.replace(d)
Out[48]:
fol T_opp T_Dir T_Enh Activity
0 1 0 0 1 hf
1 2 1 0 0 hx
2 2 0 0 0 fe
3 3 0 1 0 rn

另一种方法是使用 filter 并在替换后将结果连接在一起:

In [10]: df
Out[10]:
fol T_opp T_Dir T_Enh Activity
0 1 0 0 vo hf
1 2 vr 0 0 hx
2 2 0 0 0 fe
3 3 0 bt 0 rn

In [11]: filtered = df.filter(regex='T_.+')

In [12]: res = filtered.replace({'\D': 1})

In [13]: res
Out[13]:
T_opp T_Dir T_Enh
0 0 0 1
1 1 0 0
2 0 0 0
3 0 1 0

In [14]: not_filtered = df[df.columns - filtered.columns]

In [15]: not_filtered
Out[15]:
Activity fol
0 hf 1
1 hx 2
2 fe 2
3 rn 3

In [16]: res.join(not_filtered)
Out[16]:
T_opp T_Dir T_Enh Activity fol
0 0 0 1 hf 1
1 1 0 0 hx 2
2 0 0 0 fe 2
3 0 1 0 rn 3

请注意,列的原始顺序不会保留。

您可以使用正则表达式来搜索列名,如果您要保留许多列,这可能比显式构建列表更有用。 - 运算符在与两个 Index 对象(df.columns 是一个 Index)一起使用时执行集合差异。

之后您可能需要调用 DataFrame.convert_objects() 除非您的列是字符串/整数混合列。我的解决方案假定它们都是字符串,因此我调用 convert_objects() 将值强制转换为 int dtype

关于python - 用 1 替换列中的任何字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19191832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com